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)
不要在 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)
| 归档时间: |
|
| 查看次数: |
381 次 |
| 最近记录: |