我试图读取图像文件,将其转换为字节数组,处理各个字节,然后将其转换回图像文件并导出。
我已经尝试过处理它,但是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 - javaprivate 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数组,因此您需要从数据库中获取此数组。