检查Python中的图像格式是否是无损的?
我正在开发一个应用程序,要求提交给它的图像是无损的。目前,我正在使用PIL打开图像,并检查“格式”属性是否为无损格式。这需要我手动保存一个格式列表,我不知道,例如,提交的jpeg是否恰好应用了无损变体检查Python中的图像格式是否是无损的?,python,python-imaging-library,lossless-compression,Python,Python Imaging Library,Lossless Compression,我正在开发一个应用程序,要求提交给它的图像是无损的。目前,我正在使用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', ...]:
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在顶层没有任何类型的接口来区分不同类型的压缩。您可以进入图像解码器内部,并假设使用“原始”解码器的任何东西都是无损的,但即使您想这样做,这也太有限了,它将排除GIF、LZW压缩TIFF等,以及JPEG、JPEG压缩TIFF等 请记住,真正的问题在于管理用户期望的消息和文档。检查有损图像实际上只是一种启发,一种捕捉更明显错误并提醒用户需求的方法。所以,你不需要完美的东西,但拥有一些相当好的东西可能会有所帮助 因此,只有几个选择,没有一个很好:
未定义压缩
或JPEG压缩
它是有损的,其他任何东西都是无损的。主要的缺点(除了需要安装两个映像库外)是PIL可以打开但IM不能打开的文件,反之亦然,以及PIL和IM处理不同的多映像文件,等等对于许多用例,我会非常谨慎地使用#4,但对于您的,它实际上看起来相当合理。您并不是因为代码会崩溃或出于安全原因或诸如此类的原因而试图阻止有损图像;你只是想提醒人们,如果他们提交JPEG,他们将浪费大量时间获取无用信息,对吗?你必须使用PIL吗?例如,使用PythonMagick,我很确定您可以检查
CompressionType
属性。这是一个简单得多的测试唯一有损的本机压缩类型是JPEG压缩
(用于有损的JPEG和TIFF文件);对于非本机压缩,您将得到未定义压缩
,但您可以假设这始终意味着有损。正如您所指出的,您的代码甚至不工作,因为无损JPEG仍然是'JPEG'
,而有损和无损tiff都是'tiff'
。但是让我们后退一步……你的应用程序如何处理提交的图像?它能处理无损JPEG吗?就这点而言,它是否处理PIL(或ImageMagick等)不处理的任何类型,或者不处理PIL(等)不处理的任何类型?因为,如果是这样,仅仅检查“无损”是不够的。换句话说,为什么你的应用程序需要无损图像?如果它在给定有损图像时抛出异常(或C、Java或其他语言中的等价物?),那没关系;只要将相同的代码(或相同C库的包装器)放在前端,如果失败,你就会知道应用程序将无法处理它,对吗?无论答案是什么,解决方案可能与问题的关系比检查无损性更密切。PIL将是最好的。如果PythonMagick非常简单,那么我可以试着看看是否可以添加它。至于图像格式,我只需要处理那些可以用PIL打开的格式——图像将被传递到scipy.misc.fromimage,为应用程序中的所有图像提供一个单一的输入路径(例如,我注意到直接用scipy打开GIF时,格式不同)。需要无损图像,以确保我们接收到的数据没有被压缩(科学目的)所改变。@GlenNelson你处理得不正确。假设有人提交了一个jpeg(大多数都是有损的),然后您的程序设法返回一些内容,上面写着:“不支持有损图像”。然后用户很高兴地将他的jpeg转换成png,现在您的程序接受了它。你为什么不改变一下