Проблема в том, что ImageIO.read
делает не поддержка сырья RGB (или BGRA в вашем случае) пикселей. Он ожидает, что формат файла , как BMP, PNG или JPEG и т.д.
В коде выше, это приводит к bImageFromConvert
стать null
, и это является причиной возникновения этой ошибки.
Если у вас есть byte
массив в формате 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: [email protected]<hash>: type = 0 ...
ImageIO.write(image, "PNG", new File(path));
Обратите внимание, что JPEG не хороший формат для хранения изображений с альфа-каналом. Хотя это возможно, большинство программ не отобразит его правильно. Поэтому я предлагаю использовать PNG вместо этого.
В качестве альтернативы вы можете удалить альфа-канал и использовать JPEG.
Если 'ImageIO.write (...)' жалуется, что 'image == null', это означает, что у вас нет изображения. Можете ли вы показать код, который вы используете для чтения на необработанном изображении, возможно? – haraldK
Редактировать: код добавлен – ssnake