从字节流在jpanel上绘制图像

时间:2015-05-28 19:10:53

标签: java image paintcomponent pixels

如果我在字符串向量中有一个图像作为十六进制值 - 并且想要在JPanel中重现图像 - 在覆盖方法paintComponent(Graphics g)中循环是什么样的?我猜一个嵌套循环应该适合逐行向下绘制面板。但我怎么可能知道每行有多少字节?答案只是图像的尺寸吗?例如 - 如果图像的尺寸为1000 * 910 - 我在x方向上迭代1000次,在y方向上迭代910次?完全失败 - 正如你在图像中看到的那样:

图像 格式.jpg

尺寸:100 * 910

@Override
public void paintComponent(Graphics g) {

    for (int x = 0; x < 1000; x++) {

        for (int y = 0; y < 910; y++) {
            int red = Integer.parseInt(bytesInHex[y], 16);
            int green = Integer.parseInt(bytesInHex[y + 1], 16);
            int blue = Integer.parseInt(bytesInHex[y + 2], 16);
            g.setColor(new Color(red, green, blue));
            g.drawLine(x, y, x, y);
        }
    }

}

我知道代码可能是错误的 - 但更好地展示我的糟糕尝试而不是显示任何内容。我在流的下面给出了一个片段(十六进制转换为int)

enter image description here

根据图像 - 我认为3个连续值占据屏幕上的一个像素。没有透明度所以我们有红色,绿色,蓝色。我只是在g.setcolor中放入3个succisive字节(整数)(new Color(r,g,b)),然后画一条线(点)。

显然这里完全没错 - 我在运行这个应用程序时看到的只是白色和黑色的条纹。

enter image description here

所以 - 显然我的方法是完全错误的 - 任何人都可以提供som提示和提示,也许告诉我什么是错的?

感谢

1 个答案:

答案 0 :(得分:0)

首先,您需要知道数据的方向,但假设其原始颜色数据x和y,您需要进行适当的迭代和引用:

for (int y=0; y<height; y++) {
  for (int x=0; x<width; x+=3) {
    int pixelIndex = y*width + x;
    Color col = new Color(Integer.parseInt(bytesInHex[pixelIndex], 16)
                          Integer.parseInt(bytesInHex[pixelIndex + 1], 16), 
                          Integer.parseInt(bytesInHex[pixelIndex + 2], 16));
    //draw pixel
  }
}