Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查Python中的图像格式是否是无损的?_Python_Python Imaging Library_Lossless Compression - Fatal编程技术网

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

检查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', ...]:

我正在开发一个应用程序,要求提交给它的图像是无损的。目前,我正在使用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在顶层没有任何类型的接口来区分不同类型的压缩。您可以进入图像解码器内部,并假设使用“原始”解码器的任何东西都是无损的,但即使您想这样做,这也太有限了,它将排除GIF、LZW压缩TIFF等,以及JPEG、JPEG压缩TIFF等

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

因此,只有几个选择,没有一个很好:

  • 破解PIL的解码源,以保留编码信息并将其传递到顶层。显然,这将需要在30个不同的导入器中进行一些非琐碎的工作,可能涉及C和Python,这将导致一个补丁,您必须针对(缓慢)发展的代码库进行维护,当然,您可以始终将其提交到上游,并希望它能够进入未来版本的PIL

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

  • 与PIL一起(或代替PIL)使用另一个库。例如,虽然ImageMagick肯定不比PIL简单多少,但它确实有一个API来告诉您图像文件使用哪种类型的压缩。基本上,如果它是
    未定义压缩
    JPEG压缩
    它是有损的,其他任何东西都是无损的。主要的缺点(除了需要安装两个映像库外)是PIL可以打开但IM不能打开的文件,反之亦然,以及PIL和IM处理不同的多映像文件,等等

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


  • 对于许多用例,我会非常谨慎地使用#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,现在您的程序接受了它。你为什么不改变一下