我试图读取图像文件,将其转换为字节数组,处理各个字节,然后将其转换回图像文件并导出。
我已经尝试过处理它,但是ImageIO.read
似乎无法读取ByteInputArrayStream
-它返回null。
到目前为止,这是我尝试过的操作(以及引发错误的行)
public static void RGBToGrayManual2(BufferedImage original) {
byte[] pixels = ((DataBufferByte) original.getRaster().getDataBuffer()).getData();
/*
* Code to process pixels
*/
ByteArrayInputStream grayscaleByteInputStream = new ByteArrayInputStream(pixels);
BufferedImage convertedGrayscale = null;
try {
// below line throws the error
convertedGrayscale = ImageIO.read(grayscaleByteInputStream);
ImageIO.write(convertedGrayscale, "jpg", new File("converted-grayscale-002.jpg"));
} catch (IOException e) {
System.err.println("IOException: " + e);
}
}
和错误消息
线程“主”中的异常java.lang.IllegalArgumentException:图像
==空!在javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:925)
在javax.imageio.ImageIO.getWriter(ImageIO.java:1591)在
javax.imageio.ImageIO.write(ImageIO.java:1520)在
project2.ImageProcessing.RGBToGrayManual2(ImageProcessing.java:252)
在project2.ImageProcessing.main(ImageProcessing.java:284)
我也看过类似的文章-Null returned from ImageIO.read(new ByteArrayInputStream(bs));-接受的答案似乎表明这是编码方面的问题。
我看过另一篇文章Which Java library provides base64 encoding/decoding?来解码bytes数组,但我认为我做的不正确。
这是我尝试过的:
String encodedPixelsString = DatatypeConverter.printBase64Binary(pixels);
byte[] decodedPixelsString = DatatypeConverter.parseBase64Binary(encodedPixelsString);
ByteArrayInputStream pixelsStreamInputStream = new ByteArrayInputStream(decodedPixelsString);
并传递给解码数组的ByteArrayInputStream作为参数
convertedGrayscale = ImageIO.read(pixelStreamInputStream);
但是,它产生了完全相同的错误消息。
我对解决此问题的两个可能方向的想法-但我不确定细节:
用
ImageIO.read
方法找出问题尝试以其他方式公开图像文件的字节数组
这是我们必须要做的一项工作,但是我以前从未从事过图像处理工作,因此,我对要做的事情有些迷茫。我真的很感激任何指针
最佳答案
首先,异常不是来自ImageIO.read(...)
方法。它应按要求返回null
。因此,当您使用ImageIO.write(...)
图像调用null
时,就会发生异常。
现在,ImageIO.read(...)
为输入输入返回null
的原因仅仅是因为ImageIO
从文件格式读写图像。您的pixels
byte
数组不是文件格式,而是原始像素数据(不,这与Base64或其他字符串编码无关)。
现在,假设您的pixel
数组是8位/像素灰度格式(重要的是,如果此假设是错误的,下面的代码将不起作用,但是您没有提供足够的信息供其他人确定,所以需要修改代码以适合您的数据),则可以轻松地重新创建BufferedImage
:
byte[] pixels = ((DataBufferByte) original.getRaster().getDataBuffer()).getData();
/*
* Code to process pixels (just as before)
*/
// Replace the ImageIO.read invocation with the following code
// Note that *pixels* must be in 8 bits/pixel (grayscale) for this to work,
// it is not cheating! :-)
BufferedImage convertedGrayscale = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
convertedGrayScale.getRaster().setDataElements(0, 0, width, height, pixels);
try {
ImageIO.write(convertedGrayscale, "jpg", new File("converted-grayscale-002.jpg"));
}
catch (IOException e) {
System.err.println("IOException: " + e);
}
关于java - ImageIO.read无法读取ByteArrayInputStream(图像处理),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34308211/