此帖子是对以下内容的跟踪: ImageIO.read can't read ByteArrayInputStream (image processing)
类似于OP,每当我尝试从ByteArrayInputStream读取时,我都会得到一个空指针(正如最佳答案所解释的那样)。注意到这一点,我已经实现了上面帖子中@haraldK的答案中的代码,以纠正此问题,但是我遇到了另一个问题。我有以下代码:
byte[] imageInByteArr = ...
// convert byte array back to BufferedImage
int width = 1085;
int height = 696;
BufferedImage convertedGrayScale = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
convertedGrayScale.getRaster().setDataElements(0, 0, width, height, imageInByteArr );
try {
ImageIO.write(convertedGrayScale, "jpg", new File("C:\\test.jpg"));
}
catch (IOException e) {
System.err.println("IOException: " + e);
}
执行后,我在try / catch块之前的一行上遇到java.lang.ArrayIndexOutOfBoundsException: null
错误。我首先想到的是,此空指针是由于C驱动器中没有名为test.jpg
的文件而产生的。我已调整以解决该问题,但在convertedGrayScale.getRaster().setDataElements(0, 0, width, height, imageInByteArr );
上仍然遇到相同的空指针问题。为什么会这样呢?
另一方面,除了使用ImageIO编写文件之外,还有其他方法可以将byte []转换为图像的可视表示吗?我试图将数组打印到文件上并将其另存为“ .jpg”,但该文件无法打开。任何建议都会有所帮助。总而言之,我希望将byte []转换为图像并将其保存或将其呈现到浏览器中。哪个更容易/可行。
答案 0 :(得分:0)
您的imageInByteArr
似乎太短。我可以从中得到与您相同的错误
public static void main(String[] args) {
int width = 1085;
int height = 696;
byte[] imageInByteArr = new byte[width ];
BufferedImage convertedGrayScale = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
convertedGrayScale.getRaster().setDataElements(0, 0, width, height, imageInByteArr);
}
当使用width*height
作为imageInByteArr
或更大的大小时,我没有出现错误,但是当它小于您要更新的数据时,将引发异常。