gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 16:44:49 25 4
gpt4 key购买 nike

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

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))

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

最佳答案

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

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

请记住,真正的问题在于消息传递和文档——管理用户期望。检查有损图像实际上只是一种启发式方法,一种捕捉更明显错误并提醒用户要求是什么的方法。因此,您不需要完美的东西,但拥有非常好的东西无论如何都会有所帮助。

所以,只有几个选项,都不是很好:

  1. 破解 PIL 的解码器源以保留编码信息并将其向上传递到顶层。显然,这需要在 30 个不同的导入器中进行一些不平凡的工作,可能涉及 C 和 Python,并且它会产生一个补丁,您必须针对(缓慢)发展的代码库进行维护——尽管当然,您始终可以将它提交到上游,并希望它能进入 PIL 的 future 版本。

  2. 深入研究解码器本身以获取运行时的信息。你能真正找到的唯一半标准的东西是他们使用原始解码器还是位解码器,这根本没有用(许多无损格式需要位解码器),所以你可能最终会阅读所有 30进口商并编写十几段代码以从中提取信息。

  3. 将另一个库与(或代替)PIL 一起使用。例如,虽然 ImageMagick 绝对比 PIL 容易得多,但它确实有一个 API 可以告诉您图像文件使用的压缩类型。基本上,如果它是 UndefinedCompressionJPEGCompression 它是有损的,除此之外,它是无损的。主要缺点(除了需要安装两个图像库之外)是会有 PIL 可以打开但 IM 不能打开的文件,反之亦然,以及 PIL 和 IM 处理不同的多图像文件,等等。

  4. 做你已经在做的事。通读 30 个导入器,列出哪些是有损的,哪些是无损的。要处理有时无损的 JPEG 和 TIFF 等情况,您可能希望编写的代码不会完全拒绝它们,而是发出警告说“这些文件可能有损。您确定要导入它们吗? “(或者,或者,只为所有有损格式提供“我知道我在做什么”覆盖,然后只考虑 JPEG 和 TIFF 有损格式。)

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

关于python - 在 Python 中检查图像格式是否无损?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14948505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com