ImageIO.write bmp不起作用

时间:2013-09-23 10:25:34

标签: java bmp

我正在尝试以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”和其他一些......

提前致谢。

4 个答案:

答案 0 :(得分:18)

我刚刚完成调试类似的问题,我想我会在这里提出我的推理,虽然雅各布已经推出了PNG格式。

首先,始终检查 ImageIO.write(...)的返回值。如果找不到合适的编写器,它将返回false,并且当Jakob尝试将其写为位图时,应该发生什么。当文件的实际图像格式与“格式名称”参数中给出的格式不匹配时,会发生这种情况。在这种情况下不会抛出异常。查看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类型,则使用ImageIO.write(bi, "BMP", new File("D:\\test.bmp"))将无法成功,并且该方法将返回 false ,即使您可以在使用ImageIO.getWriterFormatNames()获得的条目列表中看到BMP / bmp。您可能必须处理编码并将图像转换为所需的格式。

第三,当遇到有时会出现问题的问题时,使用GIMP之类的图像编辑器来详细检查图像属性总是有帮助的。

@Green arrow,次要注释......您可以使用“bmp”或“BMP”作为图像格式值。这同样适用于其他格式。没关系。

答案 1 :(得分:6)

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

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

然后你可以再写一次。

答案 2 :(得分:0)

没试过,但我认为格式应该是“BMP”而不是“bmp”。 请尝试

ImageIO.write(bi, "BMP", new File("D:\\MyImage.bmp"));

看看会发生什么。

我们无法看到你的bi是如何构建的。

BufferedImage bufferedImage = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);

是否正确设置了encodingType?

我认为你的bi已经损坏,这对我来说非常合适。

BufferedImage bi = new BufferedImage(50,50,BufferedImage.TYPE_INT_RGB);
Graphics gd = bi.getGraphics();
gd.drawRect(0, 0, 10, 10);      
try {
    ImageIO.write(bi, "BMP", new File("C:\\test.bmp"));
    ImageIO.write(bi, "PNG", new File("C:\\test.png"));
} catch (IOException e) {
    System.out.println("error "+e.getMessage());
}

答案 3 :(得分:0)

使用 BufferedImage.TYPE_INT_RGB 编码适用于“gif”、“png”、“tif”以及“jpg”和“bmp”:

static void saveBufferedImageToFileTest(){

    String[] types = new String[] {"gif","png","tif","jpg","bmp"};

    //JPEG and BMP needs BufferedImage.TYPE_INT_RGB. See https://mkyong.com/java/convert-png-to-jpeg-image-file-in-java/
    //BufferedImage.TYPE_INT_RGB for all `types`
    int biType = BufferedImage.TYPE_INT_RGB;   // BufferedImage.TYPE_INT_ARGB does not work for "bmp" and "jpeg"
    BufferedImage bi = new BufferedImage(200 ,200, biType);
    Graphics g = bi.getGraphics();
    g.fillRect(50, 50, 100,  100);
    g.dispose();

    try {
        for(String type : types){
            boolean success = ImageIO.write(bi,type,new File("test_image."+type));
            System.out.println(type + (success ?  " file created" : " file NOT created") );
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}