我有一个JFrame图形用户界面,它从局域网连接的摄像机上捕捉原始视频流。我为BufferedImage(img1)中的每个坐标设置RBG值(相机为像素值分流,但像白色和黑色一样),并在标准Java扩展Canvas(MyCanvas canvas1)上绘制图像。为什么更高分辨率的BufferedImage会在Canvas中被封装和压缩?
用于在线程环境中绘制的代码片段,除了分辨率为1280x960以外,其工作正常。画布类的
while (true) {
synchronized (this) {
if (shouldrun == false) {
System.out.println("Quiting Thread.....\n");
break;
}
}
if (in.read(ch) < 0) {
break;
}
/* Mono */
pixelvalue = 0x00000000 | (ch[0] << 16)
| (ch[0] << 8) | (ch[0]);
img1.setRGB(x, y, pixelvalue);
x++;
//resWidth = 1280
if (x >= resWidth) {
x = 0;
y++;
}
framedata[pixelcount] = (byte) ch[0];
pixelcount++;
//resHeight = 960
if (pixelcount >= resWidth * resHeight) {
System.out.println("pixelcount = " + pixelcount);
if (record == true) {
System.out.println("Recording Frame...");
if (fo != null) {
fo.write(framedata);
}
}
synchronized (canvas1) {
canvas1.DrawImage(img1);
canvas1.repaint();
}
Thread.sleep(33);
pixelcount = 0;
x = 0;
y = 0;
}
}
代码段canvas1对象:
class MyCanvas extends Canvas {
int startAngle = 0;
int extent = 45;
boolean filled = false;
Image disimg = null;
public void DrawImage(Image img) {
disimg = img;
}
public void paint(Graphics g) {
g.setColor(Color.pink);
g.drawImage(disimg, 0, 0, null);
}
public void redraw(boolean filled, int start, int extent) {
this.filled = filled;
this.startAngle = start;
this.extent = extent;
repaint();
}
}
Java的GUI应用程序被成功能够从相机绘制图像在640×480(resWidth = 640 & resHeight = 480)分辨率图像如下所示
我只是将resWidth变量设置为640,resHeight变量设置为480,用于坐标增量限制和画布尺寸。
但是做同样当1280×960的分辨率,结果表明2个重复的图像和压缩/垂直挤压:
为什么会出现这种情况?我不能简单地改变代码中的宽度和高度变量吗?它可能是Jpanel布局吗?或者摄像机以这种分辨率流式传输像素值的方式?
我们没有一个水晶球来查看你的代码。在这里发布[mcve],以便人们进行调查。 –
抱歉已添加代码,希望有助于理解可行的修复 – Qwerty