LANに接続されたカメラから生のビデオストリームをキャプチャするJFrame GUIがあります。私はBufferedImage(img1)の各座標のRBG値(カメラのピクセル値をストリームしますが、白黒の色と同じです)を設定し、標準のJava拡張キャンバス(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オブジェクトのCanvasクラスのコードスニペット:
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に設定するだけです。
1280x960の解像度のために同じことをやったときにしかし、結果は2つの複製イメージを示しており、圧縮/垂直方向に押しつぶさ:
をなぜこれが起こるのでしょうか?コード内の幅と高さの変数を単純に変更することはできませんか? Jpanelのレイアウトですか?または、カメラがその解像度のピクセル値をストリームする方法は?
あなたのコードを見るためのクリスタルボールはありません。人々が調査できるように問題を再現する[mcve]をここに投稿してください。 –
申し訳ありませんが、実行可能な修正を理解するのに役立つ希望を追加しました – Qwerty