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

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

我已经尝试过处理它,但是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方法找出问题
尝试以其他方式公开图像文件的字节数组

这是我们必须要做的一项工作,但是我以前从未从事过图像处理工作,因此,我对要做的事情有些迷茫。我真的很感激任何指针

java大神给出的解决方案

首先,异常不是来自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);
}

怎么把JPEG图像转换成TIFF图像? - java

我正在开发一个用于图像处理的应用程序,因为我需要将JPEG文件转换为TIFF文件。我已经尝试了下面的代码片段进行转换。但是,它正在生成损坏的tiff文件。这是代码:package javaapplication2; import java.awt.Color; import java.awt.image.BufferedImage; import java.…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

从方法返回数组-Java - java

private static Coordinate[] getCircleCoordintaes() { Coordinate coordinates[] = {new Coordinate(0, 0)}; return coordinates; } 以上程序工作正常。在上面的程序中,返回的坐标数组首先初始化了数组使用这条线Coordinate coordi…

Java Swing SearchBox模型 - java

我需要使用Java Swing的搜索框,如果单击任何建议,当输入字母时它将显示来自数据库的建议,它将执行一些操作。如果有可能在Java swing中,请提供源代码提前致谢 java大神给出的解决方案 您可以使用DefaultComboBoxModel,输出将是这样。Try this在此代码中,您将找到countries数组,因此您需要从数据库中获取此数组。