Java ImageIO.write bmp不工作

Java ImageIO.write bmp不工作,java,bmp,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.getWritePerformatNames()给了我“jpg”、“bm

我正在尝试以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.getWritePerformatNames()
给了我“jpg”、“bmp”、“jpeg”和其他一些

提前谢谢


Jakob没有尝试,但我认为格式应该是“BMP”,而不是“BMP”。 请试一下

ImageIO.write(bi, "BMP", new File("D:\\MyImage.bmp"));
看看会发生什么

我们看不到您的bi是如何构建的

BufferedImage bufferedImage = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
编码类型设置正确吗

我认为你的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());
}

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

ImageIO.write(bi, "BMP", new File("D:\\MyImage.bmp"));
看看会发生什么

我们看不到您的bi是如何构建的

BufferedImage bufferedImage = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
编码类型设置正确吗

我认为你的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());
}

我刚刚调试完一个类似的问题,我想我会在这里给出我的理由,尽管Jakob已经开始使用PNG格式

首先,始终检查ImageIO.write(…)的返回值。如果找不到合适的编写器,它将返回false,这就是Jakob尝试将其作为位图编写时应该发生的情况。当文件的实际图像格式与“format name”参数中给出的格式不匹配时,会发生这种情况。在这种情况下不会引发异常。查看以下文档:

其次,使用BuffereImage#getType()方法检查BuffereImage对象的映像类型。在中检查可能的返回值。例如,如果从BuffereImage对象(表示带有alpha组件的PNG)获取类型为type_INT_ARGB,则使用
ImageIO.write(bi,“BMP”,new File(“D:\\test.BMP”)
将无法成功,并且该方法将返回false,即使您可以在使用
ImageIO.getWritePerformatNames()
获得的条目列表中看到BMP/BMP。您可能需要进行编码并将图像转换为所需的格式

第三,当遇到这样的问题时(有时可能是一种痛苦),使用图像编辑器(如详细查看图像属性)总是有帮助的


@绿色箭头,一个小音符。。。您可以使用“bmp”或“bmp”作为图像格式值。这同样适用于其他格式。没关系。

我刚刚调试完一个类似的问题,我想我会在这里给出我的理由,尽管Jakob已经开始使用PNG格式

首先,始终检查ImageIO.write(…)的返回值。如果找不到合适的编写器,它将返回false,这就是Jakob尝试将其作为位图编写时应该发生的情况。当文件的实际图像格式与“format name”参数中给出的格式不匹配时,会发生这种情况。在这种情况下不会引发异常。查看以下文档:

其次,使用BuffereImage#getType()方法检查BuffereImage对象的映像类型。在中检查可能的返回值。例如,如果从BuffereImage对象(表示带有alpha组件的PNG)获取类型为type_INT_ARGB,则使用
ImageIO.write(bi,“BMP”,new File(“D:\\test.BMP”)
将无法成功,并且该方法将返回false,即使您可以在使用
ImageIO.getWritePerformatNames()
获得的条目列表中看到BMP/BMP。您可能需要进行编码并将图像转换为所需的格式

第三,当遇到这样的问题时(有时可能是一种痛苦),使用图像编辑器(如详细查看图像属性)总是有帮助的


@绿色箭头,一个小音符。。。您可以使用“bmp”或“bmp”作为图像格式值。这同样适用于其他格式。没关系。

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

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

然后您可以再次写入。

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

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

然后您可以再次写入。

使用
buffereImage。键入_INT_RGB
编码适用于“gif”、“png”、“tif”以及“jpg”和“bmp”:


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


“不起作用”到底是什么意思?您是否收到任何错误消息?而且你的“代码”不太可能真正起作用,因为你必须转义反斜杠。@chrylis反斜杠是转义的,它只是在问题中没有这样显示(当你没有将其格式化为代码时会发生这种情况)。“不起作用”意味着我使用“bmp”时没有创建文件格式。
write
返回一个
boolean
,您应该检查它。简短的回答是:
TYPE\u INT\u ARGB
不起作用,但是
TYPE\u INT\u RGB
起作用。“不起作用”到底是什么意思?您是否收到任何错误消息?而且你的“代码”不太可能真正起作用,因为你必须转义反斜杠。@chrylis反斜杠是转义的,它只是在问题中没有这样显示(当你没有将其格式化为代码时会发生这种情况)。“不起作用”意味着我使用“bmp”时没有创建文件格式。
write
返回一个
boolean
,您应该检查它。简短的回答是:
TYPE\u INT\u ARGB
不起作用,但是
TYPE\u INT\u RGB
起作用。图像类型是BufferedImage.TYPE\u INT\u ARGB。这适用于png文件类型。我现在尝试了buffereImage.TYPE_INT_RGB,现在实际创建了一个BMP文件。但是它全是黑色的。。当使用BuffereImage.TYPE_INT_RGB时,PNG文件中的图像也是黑色的。使用TYPE_INT_ARGB和“BMP”而不是“BMP”如何?当使用BMP而不是BMP(和BuffereImage.TYPE_INT_ARGB)时,不会创建任何文件(并且没有异常)。PNG文件创建正常。当使用BMP和BuffereImage.TYPE_INT_RGB时,将创建一个.BMP文件,但其全部为黑色。仍然创建了PNG文件。我现在无法尝试。今晚要试试吗