ImageIO.read无法读取ByteArrayInputStream(图像处理)

时间:2015-12-16 09:26:23

标签: java javax.imageio

我尝试读取图像文件,将其转换为字节数组,处理单个字节,然后将其转换回图像文件并导出。

我尝试过这项工作,但似乎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)

我也查看了类似的帖子 - 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);

然而,它产生了完全相同的错误消息。

我对解决此问题的两个可能方向的想法 - 但我不确定细节:

  1. 使用ImageIO.read方法
  2. 找出问题
  3. 尝试以不同的方式公开图像文件的bytes数组
  4. 这是我们必须完成的任务,但我之前从未使用过图像处理,因此,我对于该做什么感到有点迷茫。我真的很感激任何指针

1 个答案:

答案 0 :(得分:9)

首先,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);
}