Java-将原始数据转换为JPG/PNG

Java-将原始数据转换为JPG/PNG,java,image,png,jpeg,Java,Image,Png,Jpeg,我用相机拍摄了一张原始BGRA格式(字节数组)的图像。 如何将其保存到磁盘,作为JPG/PNG文件 我试过使用Java API中的ImageIO.write,但我得到了错误IllegalArgumentException(image=null) 代码: 请注意,“img”是原始字节数组,它不是空的。问题在于ImageIO.read不支持原始RGB(或在您的情况下为BGRA)像素。它需要一种文件格式,如BMP、PNG或JPEG等 在上面的代码中,这会导致bImageFromConvert变为nul

我用相机拍摄了一张原始
BGRA
格式(字节数组)的图像。 如何将其保存到磁盘,作为
JPG/PNG
文件

我试过使用Java API中的
ImageIO.write
,但我得到了错误IllegalArgumentException(image=null)

代码:


请注意,“img”是原始字节数组,它不是空的。

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

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

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

// 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));
//您需要知道图像的宽度/高度
整数宽度=。。。;
整数高度=。。。;
int samplesperpoixel=4;
int[]带偏移量={2,1,0,3};//BGRA命令
字节[]bgraPixelData=新字节[宽度*高度*采样每像素];
DataBuffer buffer=新的DataBufferByte(bgraPixelData,bgraPixelData.length);
WritableRaster raster=raster.createInterleavedRaster(缓冲区、宽度、高度、采样每像素*宽度、采样每像素、带偏移、空);
ColorModel ColorModel=new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB)、true、false、Transparency.半透明、DataBuffer.TYPE_BYTE);
BuffereImage image=新的BuffereImage(colorModel、光栅、colorModel.isAlphaPremultiplied(),null);
System.out.println(“图像:+图像);//应打印:image:buffereImage@:type=0。。。
write(图像,“PNG”,新文件(路径));
请注意,JPEG不是使用alpha通道存储图像的好格式。虽然这是可能的,但大多数软件不会正确显示它。所以我建议用PNG来代替


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

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

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

如果
ImageIO.write(…)
抱怨
image==null
,则表示您没有图像。你能在原始图像中显示你用来读取的代码吗?是的,删除alpha!什么样的相机可以拍摄带有alpha信息的照片?(JPEG和PNG之间的选择取决于特定的数据丢失是否比最终文件大小更可取。)@Jongware很好。我也在想这件事。可能是因为性能原因,相机只是使用了32位对齐。谢谢,我尝试了你的代码,但是如果我选择PNG格式,它会存储一个透明图像,如果我选择JPG格式,它会存储一个暗图像。我怎么才能解决这个问题呢?@ssnake就像Jongware说的,去掉阿尔法。您的图像实际上没有alpha,而是RGB+0-pad。必须更改samplesPerPixel=4;至采样每像素=3;int[]带偏移量={2,1,0,3};//BGRA到int[]的顺序BandOffset={2,1,0};//BGR顺序,构造函数ComponentColorModel(…)中的第一个假参数变为true,它成功了!!这个问题是关于Java的,没有提到Matlab。
img=imread('example.CR2');
imwrite(img,'example.JPG');