ImageIO.write bmp 不起作用

2022-09-03 04:37:48

我正在尝试以bmp格式保存图像,但它没有创建任何文件。如果我使用“png”代替,一切正常。有什么想法吗?

//This works fine:
ImageIO.write(bi, "png", new File("D:\\MyImage.png"));

//This does not work:
ImageIO.write(bi, "bmp", new File("D:\\MyImage.bmp"));

ImageIO.getWriterFormatNames()给我“jpg”,“bmp”,“jpeg”和其他一些。

提前致谢。

雅 各 布


答案 1

我刚刚完成了对类似问题的调试,我想我会在这里提出我的推理,尽管Jakob已经继续使用PNG格式。

首先,始终检查 ImageIO.write(...) 的返回值。如果找不到合适的编写器,它将返回 false,这就是 Jakob 尝试将其编写为位图时应该发生的事情。当文件的实际图像格式与“format name”参数中给出的格式不匹配时,会发生这种情况。在这种情况下,不会引发任何异常。查看文档 http://docs.oracle.com/javase/7/docs/api/javax/imageio/ImageIO.html#write(java.awt.image.RenderedImage, java.lang.String, java.io.File)

其次,使用 BufferedImage#getType() 方法检查 BufferedImage 对象的图像类型。在 http://docs.oracle.com/javase/7/docs/api/java/awt/image/BufferedImage.html#getType() 处查看可能的返回值。例如,如果从 BufferedImage 对象(表示具有 alpha 组件的 PNG)获取类型为 TYPE_INT_ARGB,则不会成功使用,并且该方法将返回 false,即使您可以在使用 获得的条目列表中看到 BMP/bmp。您可能需要进行编码并将图像转换为所需的格式。ImageIO.write(bi, "BMP", new File("D:\\test.bmp"))ImageIO.getWriterFormatNames()

第三,当遇到有时可能很痛苦的问题时,使用图像编辑器(如GIMP)详细检查图像属性总是有帮助的。

@Green箭头,一个小音符...您可以使用“bmp”或“BMP”作为图像格式值。这同样适用于其他格式。这并不重要。


答案 2

正如@bincob所说,如果写入返回 false,您可以像这样重绘源图像

BufferedImage newBufferedImage = new BufferedImage(bufferedImage.getWidth(), 
bufferedImage.getHeight(), BufferedImage.TYPE_INT_RGB);
newBufferedImage.createGraphics().drawImage(bufferedImage, 0, 0, Color.WHITE, null);

然后你可以再写一次。


推荐