【发布时间】:2013-02-03 14:29:43
【问题描述】:
我正在开发一个应用程序,该应用程序要求提交给它的图像是无损的。目前我正在使用 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 吗?例如,使用 PythonMagick,我很确定您可以检查
CompressionType属性。这是一个更简单的测试——唯一有损的本机压缩类型是JPEGCompression(有损JPEG和TIFF文件使用);对于非本地压缩,您将获得UndefinedCompression,但您可以假设这总是意味着有损。 -
正如您所指出的,您的代码甚至不起作用,因为无损 JPEG 仍然是
'jpeg',而有损和无损 TIFF 都是'tiff'。但是让我们退后一步……您的应用程序如何处理提交的图像?它可以处理无损JPEG吗?就此而言,它是否处理 PIL(或 ImageMagick 等)不处理的任何类型,或者不处理 PIL(等)处理的任何类型?因为,如果是这样,仅仅检查“无损”是不够的。 -
换句话说:为什么你的应用需要无损图片?如果在给定有损图像时它会抛出异常(或 C 或 Java 中的等价物?),那很好;只需将相同的代码(或同一个 C 库的包装器)放在您的前端,如果它失败,您就会知道应用程序将无法处理它,对吗?无论答案是什么,解决方案可能与问题的关系比检查无损性更密切。
-
PIL 最好。如果 PythonMagick 更容易,那么我可以尝试看看是否可以添加它。至于图像格式,我只需要处理那些可以用 PIL 打开的图像 - 图像将被传递到 scipy.misc.fromimage,为应用程序中的所有图像提供单一输入路径(例如 gif,我有直接在 scipy 中打开时注意到的格式不同)。需要无损图像以确保我们收到的数据没有被压缩改变(科学目的)。
-
@GlenNelson 您错误地处理了这个问题。假设有人提交了一个 jpeg(大多数情况下是有损的),然后你的程序设法返回一些内容:“不支持有损图像”。然后用户高兴地继续将他的 jpeg 转换为 png,现在您的程序接受它。你为什么不直接将他的图像转换为 png 并完成它?为什么不在继续之前将每个输入图像转换为常见的无损格式?
标签: python python-imaging-library lossless-compression