首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中检查图像格式是否无损?

在Python中检查图像格式是否无损?
EN

Stack Overflow用户
提问于 2013-02-19 09:49:32
回答 1查看 2.2K关注 0票数 3

我正在开发一个应用程序,它要求提交给它的图像是无损的。目前,我正在使用PIL打开图像,并检查" format“属性是否是无损格式。这需要我手动保存一个格式列表,并且我不知道,例如,提交的jpeg是否恰好应用了无损变体。

代码语言:javascript
复制
import PIL
import PIL.Image


def validate_image(path):
    img = PIL.Image.open(path)
    if not img.format.lower() in ['bmp', 'gif', 'png', ...]:
        raise Exception("File %s has invalid image format %s" % (path, img.format))

有没有更好的方法来检查图像文件是否无损?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-20 03:10:29

我想我现在明白了:您想要通过PIL打开图像。你想拒绝有损图像,因为你正在做某种科学处理,需要所有丢失的数据,因为对人类视觉处理不重要的信息对你的算法很重要。

PIL在顶层没有任何类型的接口来区分不同类型的压缩。你可以进入图像解码器内部,假设任何使用“原始”解码器的东西都是无损的,但即使你想这样做,那也太有限了-它将排除GIF、LZW压缩的TIFF等以及JPEG、JPEG压缩的TIFF等。

请记住,真正的问题是消息传递和文档-管理用户期望。对有损图像的检查实际上只是一种启发式的方法,一种捕捉更明显的错误并提醒用户需求的方法。所以,你不需要完美的东西,但拥有一些相当好的东西可能会很有帮助。

所以,只有几个选项,没有一个是非常好的:

  1. 破解PIL的解码器源以保留编码信息并将其向上传递到顶层。显然,这需要在30个不同的导入器中做一些不平凡的工作,可能涉及到C和Python,这将导致你必须针对(缓慢)发展的代码库维护一个补丁-当然,你总是可以向上游提交它,并希望它能进入未来的PIL版本。
  2. 深入了解解码器本身,以便在运行时获得信息。你能真正找到的唯一半标准的东西就是它们是使用原始解码器还是位解码器,这根本没有用(许多无损格式都需要位解码器),所以你最终可能需要读取所有30个导入器,并编写十几段代码来从中提取信息。
  3. 使用另一个库以及(或代替) PIL。例如,虽然ImageMagick并不比PIL简单很多,但它确实有一个应用程序接口来告诉您图像文件使用哪种压缩类型。基本上,如果是UndefinedCompressionJPEGCompression,它就是有损的,其他任何东西,它都是无损的。主要的缺点(除了需要安装两个图像库)是,将会有文件,PIL可以打开,但IM不能,反之亦然,以及多图像文件,PIL和IM不同的处理方式,以此类推。
  4. 做你已经在做的事情。通读30个进口商,列出哪些是有损的,哪些是无损的。为了处理像JPEG和TIFF这样的情况,有时是无损的,你可能想要编写不会完全拒绝它们的代码,而是给出一个警告:“这些文件可能是有损的。你确定要导入它们吗?”(或者,只需为所有有损格式提供“我知道我在做什么”覆盖,然后只考虑JPEG和TIFF有损格式。)

对于许多用例,我会非常谨慎地使用#4,但对于您的用例,它实际上似乎相当合理。你不是因为你的代码会崩溃,或者出于安全原因,或者诸如此类的原因而试图阻止有损图像;你只是试图警告人们,如果他们提交JPEG,他们将浪费大量时间来获取无用的信息,对吧?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14948505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档