2017-07-09 8 views
0

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)解像度の画像で画像を描くことができました以下に示すように 640x480Image

resWidth変数を640に、resHeight変数を座標インクリメント制限とキャンバスディメンションに対して480に設定するだけです。

1280x960の解像度のために同じことをやったときにしかし、結果は2つの複製イメージを示しており、圧縮/垂直方向に押しつぶさ: 1280x960Image

をなぜこれが起こるのでしょうか?コード内の幅と高さの変数を単純に変更することはできませんか? Jpanelのレイアウトですか?または、カメラがその解像度のピクセル値をストリームする方法は?

+0

あなたのコードを見るためのクリスタルボールはありません。人々が調査できるように問題を再現する[mcve]をここに投稿してください。 –

+0

申し訳ありませんが、実行可能な修正を理解するのに役立つ希望を追加しました – Qwerty

答えて

1

あなたが幅と高さと言うときは、カメラからの入力解像度を参照していないと仮定していますが、キャンバスでのレンダリングの方法を変更したいと思っています。入力解像度は変更できないため、入力デバイスによって異なります。つまり、実際の解像度はカメラ自体から来ているので、たとえば入力解像度を1920x1080に変更するだけでは、表示方法(出力解像度)を変更することはできません。

640x480の入力解像度のカメラ入力から、1280x960のディスプレイ解像度にレンダリングします。それを2倍にスケーリングする。 コードを元の幅と高さの640x480に戻して、画面にレンダリングするためのMyCanvasクラス拡張を確認します。

元のコード

public void paint(Graphics g) { 
    g.setColor(Color.pink); 
    g.drawImage(disimg, 0, 0, null); 
} 

は、私はあなたがこのことから望む

public void paint(Graphics g) { 
    g.setColor(Color.pink); 
    g.drawImage(disimg, 0, 0, desiredWidth, desiredHeight, null); 
} 
desiredWidthとdesiredHeightができ

(640×480)または(1280×960)か何かに変更しますが、あなたができるものです入力解像度ではなくコントロールです。

あなたも

public void paint(Graphics g) { 
    g.setColor(Color.pink); 
    g.drawImage(disimg, 0, 0, this.getWidth(), this.getHeight(), null); 
} 

これは、あなたがに見られるAPIであるようなキャンバス何かの全体の大きさを埋めるために画像を描画することができます。 https://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html#drawImage(java.awt.Image,%20int,%20int,%20int,%20int,%20java.awt.image.ImageObserver)

希望、ハッピーコーディング!

+0

ありがとう、はい私はそれがキャンバス上の画像を表示する解像度であることを意味した。実際には、カメラから来る元のピクセルデータが1280x960解像度であると考えているので、入力解像度は1280x960になります。私はキャンバスの全体のサイズを埋めるためにイメージを描画しようとします。 – Qwerty

関連する問題