为什么PIL(pillow)的Image.save()方法会减小文件大小?

8

我正在使用PIL来旋转一些图片,但我发现输出文件要小得多,所以我进行了一个测试:除了保存exif信息(因为我知道PIL Image默认不保存exif信息)外,什么都不做。下面是我的测试代码:

    from PIL import Image
    test = Image.open('my_image_file.jpg')
    holdexif = test.info["exif"]
    test.save('my_saved_image_file.jpg',"jpeg",exif=holdexif)

当我执行上述操作后,my_saved_image_file.jpg的大小(441 KB)比原始文件my_image_file1.83 MB)明显要小。为什么会这样?有什么遗漏吗?
当我查看两个文件的各种属性时,它们似乎是相同的。它们都是56英寸x 27英寸,每英寸72像素,都是4032 x 1960像素。我在图像文件方面绝不是专家。基于我检查过的这些事物(大小、分辨率和图像外观),这些文件在我看来是相同的。据我所看/理解的,唯一不同的是磁盘上的文件大小。我应该查看什么?还有什么可能是不同的?
我还尝试了在保存中使用quality= kwarg:
    test.save('my_saved_image_file.jpg',"jpeg",exif=holdexif,quality=95)

这给了我一个文件(1.73 MB),几乎与原始文件(1.83 MB)一样大。但是我不知道有什么不同导致文件更大(而且我不明白什么让“质量”更好;对我来说图像看起来相同)。我想弄清楚这两个文件之间到底有什么不同,以便做出决定。也许对我的目的来说较小的文件大小已经足够了。

1
PILIMAGE正在进行压缩。 您可以在此处检查:https://github.com/python-pillow/Pillow/blob/master/src/PIL/Image.py#L60 - Charanjit Singh
1
谢谢。压缩是否会导致实际质量的损失?在我看来似乎没有。但是正如我所提到的,对于质量,我只知道查看大小、分辨率和屏幕上的外观。在压缩过程中有什么丢失的吗?如果有,是什么?谢谢。 - Daniel Goldfarb
1
让我们在这里尝试检查一下。在“差异”选项卡中,https://www.diffchecker.com/image-diff - Charanjit Singh
我正在阅读代码,试图找出它如何从文件解码图像并将其作为文件放回。 - Charanjit Singh
谢谢。Diffchecker很好用,但它没有显示出任何差异(使用质量=95%,将尝试其他级别)。我还在阅读这篇文章,以便更好地理解压缩的影响:http://fotoforensics.com/tutorial-estq.php。显然,压缩会有一些损失,只是肉眼可能不容易察觉。 - Daniel Goldfarb
显示剩余3条评论
1个回答

4
正如Charanjit所指出的,答案在于压缩程度(由save()方法的quality关键字参数控制)。更高的压缩意味着文件更小,但“质量”更低。
关于“质量”,这意味着,尽管图像大小和分辨率可能相同,但压缩会降低图像内物体边缘的清晰度以及颜色差异(可能对肉眼不明显)。
这里有一篇关于JPEG压缩的好文章:Understanding JPEG Quality
还有另一个stackoverflow答案解决了尝试以与原始图像相同的质量保存JPEG文件的问题:https://dev59.com/YW855IYBdhLWcg3wbjnO#4355281,通过将kwarg quality设置为“keep”(而不是介于1和100%之间的整数N)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接