Java - 将RAW转换为JPG / PNG

时间:2015-07-16 14:26:35

标签: java image png jpeg

我有一个由相机捕获的图像,格式为RAW BGRA(字节数组)。 如何将其作为JPG/PNG文件保存到磁盘?

我尝试使用Java API中的ImageIO.write,但是我收到错误IllegalArgumentException(image = null)

CODE:

try
{
    InputStream input = new ByteArrayInputStream(img);
    BufferedImage bImageFromConvert = ImageIO.read(input);

    String path = "D:/image.jpg";

    ImageIO.write(bImageFromConvert, "jpg", new File(path));
}
catch(Exception ex)
{
    System.out.println(ex.toString());
}

请注意,“img”是RAW字节数组,它是非空的。

2 个答案:

答案 0 :(得分:1)

问题是ImageIO.read 支持原始RGB(或您的情况下为BGRA)像素。它需要文件格式,如BMP,PNG或JPEG等。

在上面的代码中,这会导致bImageFromConvert成为null,这就是您看到错误的原因。

如果您有BGRA格式的byte数组,请尝试以下操作:

// You need to know width/height of the image
int width = ...;
int height = ...;

int samplesPerPixel = 4;
int[] bandOffsets = {2, 1, 0, 3}; // BGRA order

byte[] bgraPixelData = new byte[width * height * samplesPerPixel];

DataBuffer buffer = new DataBufferByte(bgraPixelData, bgraPixelData.length);
WritableRaster raster = Raster.createInterleavedRaster(buffer, width, height, samplesPerPixel * width, samplesPerPixel, bandOffsets, null);

ColorModel colorModel = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_BYTE);

BufferedImage image = new BufferedImage(colorModel, raster, colorModel.isAlphaPremultiplied(), null);

System.out.println("image: " + image); // Should print: image: BufferedImage@<hash>: type = 0 ...

ImageIO.write(image, "PNG", new File(path));

请注意,JPEG不是用于存储Alpha通道图像的良好格式。虽然有可能,但大多数软件都无法正常显示。所以我建议改用PNG。

或者,您可以删除Alpha通道,并使用JPEG。

答案 1 :(得分:0)

使用Matlab,您可以用两行代码转换所有类型的图像:

img=imread('example.CR2');
imwrite(img,'example.JPG');