将字节数组转换为图像

3

我有一个大小为640*480*3的字节数组,它的字节顺序是r,g,b。我正在尝试将其转换为图像。以下代码不起作用:

BufferedImage img = ImageIO.read(new ByteArrayInputStream(data));

除了

Exception in thread "main" java.lang.IllegalArgumentException: image == null!
at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:925)
at javax.imageio.ImageIO.getWriter(ImageIO.java:1591)
at javax.imageio.ImageIO.write(ImageIO.java:1520)

我也尝试了这段代码:
ImageIcon imageIcon = new ImageIcon(data);
Image img = imageIcon.getImage();
BufferedImage bi = new BufferedImage(img.getWidth(null),img.getHeight(null),BufferedImage.TYPE_3BYTE_BGR); //Exception

但是没有成功:

Exception in thread "main" java.lang.IllegalArgumentException: Width (-1) and height (-1) must be > 0

我该如何从这个数组中获取图像?

1个回答

2

一个普通的字节数组并不是一个被广泛承认的图像格式。你需要自己编写代码进行转换。幸运的是,这并不是很难做到:

int w = 640;
int h = 480;
BufferedImage i = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
for (int y=0; y<h; ++y) {
    for (int x=0; x<w; ++x) {
        // calculate index of pixel
        // depends on exact organization of image
        // sample assumes linear storage with r, g, b pixel order
        int index = (y * w * 3) + (x * 3);
        // combine to RGB format
        int rgb = ((data[index++] & 0xFF) << 16) |
                  ((data[index++] & 0xFF) <<  8) |
                  ((data[index++] & 0xFF)      ) |
                  0xFF000000;
        i.setRGB(x, y, rgb);
    }
}

像素索引的精确公式取决于你在数组中组织数据的方式 - 你并没有很明确地指定。不过原则总是相同的,将R、G、B值合并为RGB(准确来说是ARGB)值,并使用setRGB()方法将其放入BufferedImage中。


一个普通的字节数组不是一种被广泛认可的图像格式。这个信息的来源是什么,为什么会这样呢?而第二种情况实际上揭示了他对图像本身有问题,他打算读取它。 - Sage
@Sage 信息来源是“常识”。未指定的内容不能成为一种普遍认可的图像格式,不是吗?有无数种方法可以将图像转换为byte[](而且OP简要描述了它是6404803-这不留下任何空间供任何元数据使用,因此它不能是通用格式)。至少对于我来说,这是显而易见的。而且“读取”图像时出现的问题是格式无法被识别的自然结果。所有异常直接或间接地源于无法识别的图像格式。请查看IconImage的Javadocs。 - Durandal
谢谢,我错过了提到 640*480*3。实际上他的第二个异常让我分心并困惑了我。 - Sage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接