【发布时间】:2012-07-09 04:26:54
【问题描述】:
我有很多 .ico 格式的图片,我想在我的 Java SE 项目中使用它们,但它不知道格式。我该如何解决这个问题?
【问题讨论】:
-
Java 似乎本身并不支持 ico 格式。试试这个链接:stackoverflow.com/questions/11090508/…
我有很多 .ico 格式的图片,我想在我的 Java SE 项目中使用它们,但它不知道格式。我该如何解决这个问题?
【问题讨论】:
试试image4j - Image Library for Java
image4j 库允许您读取和写入某些图像格式 在 100% 纯 Java 中。
目前支持以下格式:
- BMP(Microsoft 位图格式 - 未压缩;1、4、8、24 和 32 位)
- ICO(Microsoft 图标格式 - 1、4、8、24 和 32 位 [XP 未压缩, Vista 压缩])
使用该库,您可以轻松解码您的 ico 文件
List<BufferedImage> image = ICODecoder.read(new File("input.ico"));
【讨论】:
Apache Commons Imaging允许读写ICO文件:
List<BufferedImage> images = Imaging.getAllBufferedImages(new File("input.ico"));
它还支持多种流行的元数据格式(EXIF、IPTC 和 XMP)。
TwelveMonkeys ImageIO 允许扩展 ImageIO API 以支持 ICO 和许多其他图像文件格式。
【讨论】:
使用 Apache Commons Imaging 1.0-alpha2 读取 ico 文件的提示:
将 ico 文件作为文件读取和将 ico 文件作为字节读取似乎是有区别的:Imaging.getAllBufferedImages(File) 读取 ico 文件,Imaging.getAllBufferedImages(new ByteArrayInputStream(byte[] icoFileContent, yourIcoFilename) 也读取 ico 文件。 Imaging.getAllBufferedImages(byte[]) 不会读取相同的 ico 文件,但会抛出 ImageReadException。请参阅下面的代码。
File icoFile = new File("bluedot.ico");
// Works fine
List<BufferedImage> images = Imaging.getAllBufferedImages(icoFile);
Assert.assertFalse(images.isEmpty());
ImageIO.write(images.get(0), "png", new File("bluedot.png"));
// Also works fine
byte[] icoFileContent = Files.readAllBytes(icoFile.toPath());
images = Imaging.getAllBufferedImages(new ByteArrayInputStream(icoFileContent), "bluedot.ico");
Assert.assertFalse(images.isEmpty());
ImageIO.write(images.get(0), "png", new File("bluedot2.png"));
// Throws an exception
images = Imaging.getAllBufferedImages(icoFileContent);
另外,这里是我如何创建 .ico 文件的指南,该文件不能被 Apache Commons Imaging 1.0-alpha2 读取为byte[](但可以读取为File,并且可以读取为ByteArrayInputStream):
Imaging.getAllBufferedImages(byte[]) 将抛出 org.apache.commons.imaging.ImageReadException: Can't parse this format.
Imaging.getAllBufferedImages(File) 将读取此文件。【讨论】: