Java Image==null!在ImageIO.ByteArrayInputStream中读取

Java Image==null!在ImageIO.ByteArrayInputStream中读取,java,image,Java,Image,我正在尝试使用游程编码压缩图像,并将其另存为JPEG 但是,当我尝试从BYteArrayInputStream读取BuffereImage时,程序失败,在下面的第行返回以下内容(BuffereImage bImage2=ImageIO.read(bis);)cus ImageIO.read(bis)返回null-bis不为null: Exception in thread "main" java.lang.IllegalArgumentException: image == null! at j

我正在尝试使用游程编码压缩图像,并将其另存为JPEG

但是,当我尝试从BYteArrayInputStream读取BuffereImage时,程序失败,在下面的第行返回以下内容(BuffereImage bImage2=ImageIO.read(bis);)cus ImageIO.read(bis)返回null-bis不为null:

Exception in thread "main" java.lang.IllegalArgumentException: image == null!
at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:925)
at javax.imageio.ImageIO.getWriter(ImageIO.java:1592)
at javax.imageio.ImageIO.write(ImageIO.java:1520)
at Compression.main(Compression.java:17)
以下是我当前使用的代码:

File input = new File("testEmily.jpeg");
    BufferedImage image = ImageIO.read(input);
    byte[] byteArray = RunLength.toByteArrayAutoClosable(image, "jpeg");
    byte[] compressedBytes2 = RunLength.compress(byteArray);
    ByteArrayInputStream bis = new ByteArrayInputStream(compressedBytes2);
    BufferedImage bImage2 = ImageIO.read(bis);
    ImageIO.write(bImage2, "jpeg", new File("compressedEmily.jpeg") );

如果有人想复制-

buffereImage=ImageIO.read(输入),这也是github repo链接
可能返回null。这可能是由于图像文件损坏或找不到该文件造成的。确保正确读取文件,并检查
ImageIO.read(…)
的返回值是否为非空

ImageIO.read()的

该文件被包装在ImageInputStream中。如果没有注册的ImageReader声称能够读取结果流,则返回null


请阅读
RunLength.compress返回的内容?它是否为有效图像,由
ImageIO
识别(正确的标题、编码等)?文档:“如果没有注册的ImageReader声称能够读取结果流,则返回null。”是的,这是有效的图像,我可以使用此示例对其进行压缩:但希望执行运行长度编码。您可以在github repo i linked上检查RunLenght压缩(注释对于代码来说太短),但它返回字节[],对图像进行run-length编码,然后期望能够将其作为图像读取,这是毫无意义的。你的意思是运行长度解码吗?如果编码的结果不是图像,那么你不能合理地期望能够将任何编码作为图像来读取,这里的证据清楚地表明它不是。这段代码到底有什么意义?当你开始的时候,你已经有了一个图像,而你正试图以另一个图像结束。为什么不直接复制字节呢?JPEG已经被压缩了:如果你想要更多的压缩,只需改变
q
因子。你不能仅仅发明你自己的编码并期望每个人都能忍受它。生活不是这样的。不,BuffereImage bImage2=ImageIO.read(bis)下面的行;returned null and bis not null修复了指出null发生位置的问题。@miyavmiyav没有人建议
bis
为null,当然这是不可能的。您认为
ImageIO.read()
没有返回null的建议是荒谬的。好吧,我明白了。据我所知,您的代码是压缩图像,然后从压缩的图像字节创建输入流。然后尝试将此流解码为无效的图像,因为压缩图像不是有效的图像文件。你只是想保存到压缩数据以备以后使用,还是想保存一个可以用普通图像查看程序打开的有效图像文件?@user207421我不知道你为什么这么咄咄逼人。我只是用了错误的措辞,我的意思是它失败了,因为在下面的行中为空。注释还显示它在第行(BuffereImage=ImageIO.read(input);)上返回null,但在下面4行的第二个ImageIO.read上它没有返回null。@Jannik我想将压缩数据保存为jpeg格式,这样我就可以查看它在本例()中的压缩外观,但使用运行长度编码(现在我不知道是否可以使用运行长度ENCDO)