如何在Java中将图像的光栅字节数组转换为原始图像?

3

我需要将一张图片的字节转换回原始图片。我的字节数组是由WritableRaster创建的,我尝试将其转换为原始形式,但生成的图像没有原始颜色。以下是我的尝试:

try {
        BufferedImage readImage = ImageIO.read(new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Desert.jpg"));
        byte imageData[] = get_byte_data(readImage); // Then I need to convert this to original image

        DataBuffer buffer = new DataBufferByte(imageData, imageData.length);
        WritableRaster raster = Raster.createInterleavedRaster(buffer, width, height, 3 * width, 3, new int[]{0, 1, 2}, (Point) null);
        ColorModel cm = new ComponentColorModel(ColorModel.getRGBdefault().getColorSpace(), false, true, Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
        BufferedImage image = new BufferedImage(cm, raster, true, null);
        ImageIO.write(image, "png", new File("image.png"));
    } catch (IOException ex) {
        Logger.getLogger(NewMain.class.getName()).log(Level.SEVERE, null, ex);
    }
}

private static byte[] get_byte_data(BufferedImage image) {
    WritableRaster raster = image.getRaster();
    DataBufferByte buffer = (DataBufferByte) raster.getDataBuffer();
    return buffer.getData();
}

你是如何将光栅转换回“原始”图像的?BufferedImage 由 Raster 和 ColorModel 组成。ColorModel 知道如何解释图像数据。 - dragon66
我这样处理颜色模型。 - TBN
1个回答

1

我找出了你代码的问题:

将这一行改为:

WritableRaster raster = Raster.createInterleavedRaster(buffer, width, height, 3 * width, 3, new int[]{2, 1, 0}, (Point) null);

将会起作用,因为原始图像数据是BGR格式,而不是RGB格式。


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