2017-07-09 56 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