【发布时间】:2016-03-22 08:44:44
【问题描述】:
我正在尝试读取图像文件,将其转换为字节数组,处理各个字节,然后将其转换回图像文件并导出。
我已经尝试过处理它,但似乎 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? - 来解码字节数组,但我认为我做得不对。
这是我尝试过的:
String encodedPixelsString = DatatypeConverter.printBase64Binary(pixels);
byte[] decodedPixelsString = DatatypeConverter.parseBase64Binary(encodedPixelsString);
ByteArrayInputStream pixelsStreamInputStream = new ByteArrayInputStream(decodedPixelsString);
并将解码后数组的ByteArrayInputStream作为参数传入
convertedGrayscale = ImageIO.read(pixelStreamInputStream);
但是它产生了完全相同的错误消息。
我对解决此问题的两个可能方向的想法 - 但我不确定细节:
- 用
ImageIO.read方法找出问题 - 尝试以不同的方式公开图像文件的字节数组
这是我们必须完成的任务,但我以前从未从事过图像处理工作,因此,我不知道该怎么做。我真的很感激任何指针
【问题讨论】:
-
您要将颜色转换为灰色吗?
-
@BahramdunAdil 是的 - 但我不允许使用任何 Java 的类方法(如
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);),我必须实现一个方法来做到这一点。 -
在异常中它非常清楚地表明您的图像(convertedGrayscale)为空
-
@BahramdunAdil
convertedGrayscale = ImageIO.read(grayscaleByteInputStream);- 此行引发错误。但是,grayscaleByteInputStream是正确的,绝对不是 null。 -
确定原件有数据吗?
标签: java javax.imageio