调用重绘时简单的缓冲图像闪烁

Pau*_*uli 1 java swing flicker repaint

我正在尝试使用 openCV 创建网络摄像头视图,但是当我重新绘制保存的图像时,它会闪烁,并且图像有时看起来是半灰色的。

import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.JPanel;

    public class Panel extends JPanel {

    BufferedImage img;
    public Panel() {
        super(true);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);


        try {
            img = ImageIO.read(new File("webcam.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        g.drawImage(img, 0, 0, 640, 480, this);
        repaint();
    }
}
Run Code Online (Sandbox Code Playgroud)

Kev*_*man 5

不要在 PaintComponent() 方法中读取图像。读取构造函数中的图像。

另外,不要从您的paintComponent()方法中调用repaint()。如果需要连续重绘,请使用线程或计时器。

编辑:这可能需要一些调整,但这是我正在讨论的基本方法:

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class Panel extends JPanel implements Runnable{

BufferedImage img;
public Panel() {
    super(true);
    new Thread(this).start();
}

public void paintComponent(Graphics g) {
    super.paintComponent(g);

    if(img != null){
        synchronized(this){
            g.drawImage(img, 0, 0, 640, 480, this);
        }
    }
}

public void run(){
    while(true){
        try {
            synchronized(this){
                img = ImageIO.read(new File("webcam.jpg"));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        repaint();

        try {
            Thread.sleep((long) (1000.0/30));
        } 
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)