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

我已经尝试过处理它,但是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/

10-14 15:34