我正在尝试读取图像文件,将其转换为字节数组,处理单个字节,然后将其转换回图像文件并导出.
我已经尝试过它,但它似乎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); } }
和错误消息
线程"main"中的异常java.lang.IllegalArgumentException:image == null!在javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:925)的javax.imageio.ImageIO.getWriter(ImageIO.java:1591)at javax.imageio.ImageIO.write(ImageIO.java:1520)at project2.ImageProcessing. RGBToGrayManual2(ImageProcessing.java:252)在project2.ImageProcessing.main(ImageProcessing.java:284)
我也看过一个类似的帖子 - 从ImageIO.read(new ByteArrayInputStream(bs))返回的Null; - 并且接受的答案似乎表明它是编码的问题.
我看过这篇文章 - 哪个Java库提供了base64编码/解码? - 解码字节数组,但我不认为我做得对.
这是我试过的:
String encodedPixelsString = DatatypeConverter.printBase64Binary(pixels); byte[] decodedPixelsString = DatatypeConverter.parseBase64Binary(encodedPixelsString); ByteArrayInputStream pixelsStreamInputStream = new ByteArrayInputStream(decodedPixelsString);
并将解码后的数组的ByteArrayInputStream作为参数传递
convertedGrayscale = ImageIO.read(pixelStreamInputStream);
但是它产生了完全相同的错误消息.
我对解决这个问题的两个可能方向的想法 - 但我不确定细节:
用ImageIO.read
方法找出问题
尝试以不同的方式公开图像文件的bytes数组
这是我们必须完成的任务,但我以前从未使用过图像处理,因此,我对于该做什么感到有点迷茫.我真的很感激任何指针
首先,例外不是来自该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); }