(扩大我的评论)
问题归结为:人们通常认为以下命令给出的“格式”:
ImageIO.getReaderFileSuffixes();
受Java支持。
但这不是应该被理解/理解的方式,因为那根本不是它的工作方式。
错误: “ ImageIO可以读取使用这些格式之一编码的任何文件”
正确: “ ImageIO无法读取以不属于这些格式之一的格式编码的图像”
但是,这对出现在该列表中的格式有何说明?好吧,这很棘手。
例如,该列表通常返回“ PNG”和“ BMP”(以及其他格式)。但是没有“一个” PNG和“一个” BMP。明天我可以使用一种“有效的”
PNG(子)格式,该格式会很好,但是那里没有任何一个PNG解码器可以解码(必须经过验证和接受:但是一旦被接受,它将“破坏所有现有的PNG解码器)。幸运的是,对于PNG图片来说,问题还算不错。
BMP格式非常复杂。您是否可以进行压缩(这可以解释您所看到的文件大小的变化)。您可以具有各种标题(长度不同,也可以解释您看到的不同文件大小)。哎呀,BMP实际上是如此复杂,以至于您可以将PNG编码的像素嵌入BMP“外壳”中。
BMP文件基本上有两种有问题的类型:
- 创建Java解码器后出现的BMP变体
- BMP变体非常模糊,以至于Java ImageIO实现者认为它不值得支持
“错误”在于认为存在一种PNG或一种BMP格式。两种格式(以及其他图像格式)实际上都是“可扩展的”。每当出现新的变体时,它就有可能破坏 任何
解码器。
所以您的情况是这样的:
您正在从MS Paint中读取原始BMP文件,并且MS Paint能够读取该文件,因为它恰好是MS Paint能够识别的BMP格式。
相同的BMP格式与您使用的Java版本无关(希望它会在另一个Java版本中受支持,但我不会指望它)。
当您重新保存从MS该文件画图,你在一个BMP格式,绝对是节省 不 一样的原始格式(该变的文件大小为相当告诉)
您的Java版本恰好支持其他格式。
现在实际解决您的问题:以我的经验,像 ImageMagick 这样的图像库比默认的Java ImageIO API能够读取更多的图片,因此我将看看
ImageMagick 周围的其他图像库或包装器。
这些库通常也进行更新以支持更新的变体和格式,比Java快得多。例如,来自Google 的惊人 WebP
格式(无损+半透明图像的PNG格式提高了28%至34%)已经得到了很多图像处理库的支持,但是在执行 ImageIO 时我并不屏息
。阅读(someWebPpicture) …
另一种选择是使用PNG:即使理论上可以扩展PNG,您也不太可能在野外找到“不受支持的” PNG。对于BMP,这太普遍了。



