我有一个由相机捕获的图像,格式为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字节数组,它是非空的。
答案 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');