簡體   English   中英

將Jpanel寫入緩沖圖像堆棧溢出

[英]Writing Jpanel to Buffered Image stack overflow

我正在嘗試將JPanel圖片寫入BufferedImage(后來轉換為Rendered Image)。 由於某種原因,我在AWT-EventQueue-0線程中收到堆棧溢出錯誤,並且不確定是否有我忽略的原因。

有問題的代碼:

public BufferedImage createImage() {
    int w = getWidth();
    int h = getHeight();
    BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    cp.paint(bi.getGraphics());

    //debug script
    File outputfile = new File("image"+index+".jpg");
    try {
        ImageIO.write(bi, "jpg", outputfile);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    index++;


    return bi;
}

JPanel paintComponent

@Override
protected void paintComponent(Graphics g) {

    super.paintComponent(g);
    r = new Random(System.nanoTime());
    int maxSize = 100;
    int randX = r.nextInt(getWidth());
    int randY = r.nextInt(getHeight());
    int randWidth = r.nextInt(maxSize);
    int randHeight = r.nextInt(maxSize);
    Color color = new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256));
    Graphics2D g2d = (Graphics2D) g;

    ovals.add(new MyCircles(randX, randY, randWidth, randHeight, color));   
    for (MyCircles c : ovals) {
            c.paint(g2d);
    }
    g2d.setColor(getForeground());


    repaint();

    double current = ImageComparator.calcDistance((RenderedImage)createImage());

    //debugging script
    System.out.println("Current: " + current);
    System.out.println("Previous" + previous);


    if(current > previous) {
        ovals.remove(ovals.size()-1);
    }
    else {
        previous = current;
    }


}

任何有關如何修改此問題的見解將不勝感激!

刪除對paintComponent中的repaint的調用,該調用導致該方法被無限調用。

與您的問題沒有直接關系,但是,您絕對不要在繪畫方法中使用Random類。 每次調用該方法時,繪畫都會更改,因此您創建和保存的圖像將與面板上的圖像不同。

同樣,出於上述相同的原因,您不應在繪制方法中添加橢圓形。

您需要創建一個addOval(...)方法,該方法將設置橢圓的隨機顏色並將橢圓添加到列表中。 繪制代碼將僅遍歷列表並繪制橢圓形。

您也不應在繪畫代碼中刪除橢圓形。 繪畫代碼僅用於繪畫,不能操縱被繪畫的對象。

您也可以嘗試Screen Image類,它基本上是圖像創建代碼的一個更靈活的版本。

當然,那里有無限循環:

這是調用方法的方式:

createImage()
 |__paint()
    |__createImage() // again in ImageComparator.calcDistance line
       |__paint()
           |__createImage() // again in ImageComparator.calcDistance line
              |__paint()
                 |__createImage() // again in ImageComparator.calcDistance line
                   |__paint()
                        TOY STORY 1 (Buzz) : to the infinite and beyond it :)

您永遠不會停止這個周期。

我建議您需要獲取圖像,然后將其與油漆的尺寸進行比較。 讓塗料僅繪制圖像並在圖像外部進行比較。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM