栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么ImageIO不能读取BMP文件,直到在MS Paint中将其重新保存?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么ImageIO不能读取BMP文件,直到在MS Paint中将其重新保存?

(扩大我的评论)

问题归结为:人们通常认为以下命令给出的“格式”:

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格式。两种格式(以及其他图像格式)实际上都是“可扩展的”。每当出现新的变体时,它就有可能破坏 任何
解码器。

所以您的情况是这样的:

  1. 您正在从MS Paint中读取原始BMP文件,并且MS Paint能够读取该文件,因为它恰好是MS Paint能够识别的BMP格式。

  2. 相同的BMP格式与您使用的Java版本无关(希望它会在另一个Java版本中受支持,但我不会指望它)。

  3. 当您重新保存从MS该文件画图,你在一个BMP格式,绝对是节省 一样的原始格式(该变的文件大小为相当告诉)

  4. 您的Java版本恰好支持其他格式。

现在实际解决您的问题:以我的经验,像 ImageMagick 这样的图像库比默认的Java ImageIO API能够读取更多的图片,因此我将看看
ImageMagick 周围的其他图像库或包装器。

这些库通常也进行更新以支持更新的变体和格式,比Java快得多。例如,来自Google 的惊人 WebP
格式(无损+半透明图像的PNG格式提高了28%至34%)已经得到了很多图像处理库的支持,但是在执行 ImageIO 时我并不屏息
。阅读(someWebPpicture)

另一种选择是使用PNG:即使理论上可以扩展PNG,您也不太可能在野外找到“不受支持的” PNG。对于BMP,这太普遍了。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/509043.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号