2017-07-09 50 views
0

我有一個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)分辨率圖像如下所示 640x480Image

我只是將resWidth變量設置爲640,resHeight變量設置爲480,用於座標增量限制和畫布尺寸。

但是做同樣當1280×960的分辨率,結果表明2個重複的圖像和壓縮/垂直擠壓: 1280x960Image

爲什麼會出現這種情況?我不能簡單地改變代碼中的寬度和高度變量嗎?它可能是Jpanel佈局嗎?或者攝像機以這種分辨率流式傳輸像素值的方式?

+0

我們沒有一個水晶球來查看你的代碼。在這裏發佈[mcve],以便人們進行調查。 –

+0

抱歉已添加代碼,希望有助於理解可行的修復 – Qwerty

回答

1

當你說寬度和高度時,我假設你並不是指來自相機的輸入分辨率,而是你想改變它在畫布上的渲染方式。因爲輸入分辨率不能改變,並且取決於輸入設備。我的意思是,您不能簡單地將輸入分辨率更改爲1920x1080,因爲實際分辨率來自相機本身,但您可以更改其顯示方式(輸出分辨率)。

因此,從640x480輸入分辨率的攝像頭輸入,您想要將其渲染到1280x960顯示分辨率。縮放兩次。 我會將您的代碼還原爲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

相關問題