【问题标题】:Simple bufferedimage flickering when calling repaint调用重绘时简单的缓冲图像闪烁
【发布时间】:2014-08-13 12:57:24
【问题描述】:

我正在尝试使用 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();
    }
}

【问题讨论】:

    标签: java swing repaint flicker


    【解决方案1】:

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

    另外,不要从您的 paintComponent() 方法中调用 repaint()。如果需要不断重绘,请使用 Thread 或 Timer。

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

    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();
            }
        }
    }
    }
    

    【讨论】:

    • 但是图像只被读取一次并且不会更新。另一个类(saveImage)每 10 毫秒将网络摄像头图像保存到 webcam.jpg
    • 所以我应该为构造函数创建一个线程来读取图像并重新绘制?并且只在paintcomponent中绘制图像?
    • 谢谢!这一定是绘制它的正确方法。它仍然给我一些灰色闪烁,但可能是opencv保存照片的问题。我可能使用错误的 API,因为 java 可用的文档很少
    • 您可能还会遇到文件在加载时被覆盖的情况。您可能想使用某种索引系统或其他东西,而不是一遍又一遍地从同一个文件中写入/读取。
    • 是的,就是这样。我从 1 个文件更改为 3 个文件系统,现在它可以正常工作了。再次感谢!
    猜你喜欢
    • 2012-06-07
    • 2013-01-17
    • 2013-07-20
    • 2010-10-05
    • 2019-08-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多