我有一個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