在我的代码中,我有一个缓冲图像 http://docs.oracle.com/javase/7/docs/api/java/awt/image/BufferedImage.html那是装载有ImageIO http://docs.oracle.com/javase/7/docs/api/javax/imageio/ImageIO.html像这样的类:
BufferedImage image = ImageIO.read(new File (filePath);
后来,我想将它保存到字节数组中,但是ImageIO.write
方法要求我选择 GIF、PNG 或 JPG 格式来编写图像(如教程中所述)here http://docs.oracle.com/javase/tutorial/2d/images/saveimage.html).
我想选择与原始图像相同的文件类型。如果图像最初是 GIF,我不希望将其保存为 PNG 带来额外的开销。但如果图像最初是 PNG,我不想通过将其保存为 JPG 或 GIF 来失去半透明度等。有没有办法可以从 BufferedImage 确定原始文件格式是什么?
我知道我可以在加载图像时简单地解析文件路径以查找扩展名并保存以供稍后使用,但我理想情况下希望有一种直接从 BufferedImage 执行此操作的方法。
正如@JarrodRoberson 所说,BufferedImage
没有“格式”(即没有文件格式,它确实有几种像素格式之一,或像素“布局”)。我不了解 Apache Tika,但我想他的解决方案也可行。
但是,如果您更喜欢仅使用ImageIO
并且不向项目添加新的依赖项,您可以编写如下内容:
ImageInputStream input = ImageIO.createImageInputStream(new File(filePath));
try {
Iterator<ImageReader> readers = ImageIO.getImageReaders(input);
if (readers.hasNext()) {
ImageReader reader = readers.next();
try {
reader.setInput(input);
BufferedImage image = reader.read(0); // Read the same image as ImageIO.read
// Do stuff with image...
// When done, either (1):
String format = reader.getFormatName(); // Get the format name for use later
if (!ImageIO.write(image, format, outputFileOrStream)) {
// ...handle not written
}
// (case 1 done)
// ...or (2):
ImageWriter writer = ImageIO.getImageWriter(reader); // Get best suitable writer
try {
ImageOutputStream output = ImageIO.createImageOutputStream(outputFileOrStream);
try {
writer.setOutput(output);
writer.write(image);
}
finally {
output.close();
}
}
finally {
writer.dispose();
}
// (case 2 done)
}
finally {
reader.dispose();
}
}
}
finally {
input.close();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)