为什么PIL生成的JPEG图像质量如此之差?

40

PIL(1.1.7)创建的JPEG图像质量非常差,以下是一个例子:

输入:https://s23.postimg.cc/8bks3x5p7/cover_1.jpg

输出:https://s23.postimg.cc/68ey9zva3/cover_2.jpg

以下是生成输出图像的代码:

from PIL import Image
im = Image.open('/path/to/cover_1.jpg')
im.save('/path/to/cover_2.jpg', format='JPEG', quality=100)

红色文本看起来真的很糟糕。用GIMP或Photoshop保存图像甚至无法接近PIL创建的糟糕质量。有人知道为什么会出现这种情况以及如何解决吗?


1
您正在保存 JPEG 的 JPEG。您将损失信息两次。您确定 GIMP 和 Photoshop 实际上是再次处理 JPEG 而不仅仅是按原样保存它吗(因为程序将其识别为 JPEG,因此不对其进行任何操作)? - John
感谢您的快速回复。我知道我正在两次丢失信息。这只是一个非常简单的例子。在生产中,我也会调整图像大小:)。此外,如果我在GIMP或Photoshop中调整图像大小,则生成的图像看起来更加清晰。两个人在两张照片中看起来几乎相同,但红色文本看起来确实不同。 - Pascal
我并不怀疑从GIMP / Photoshop看起来更清晰。但是与输入图像有什么不同吗?从GIMP / Photoshop保存为JPEG后,是否有任何变化?如果答案是否定的,那么PIL可能看起来“糟糕”,因为它实际上正在应用JPEG压缩,而另一个则没有。你明白我的意思吗? - John
你对我的回答所做的修改看起来非常熟悉,所以我进行了搜索 - 这不是我第一次回答这个问题了,并且有一个带有相同信息的评论。https://dev59.com/aG_Xa4cB1Zd3GeqP5M6P - Mark Ransom
@MarkRansom 那就是我得到解决方案的地方 :) - Pascal
@约翰_"你正在保存JPEG文件的副本。这样做会损失两次信息"_. 假设在两次编码之间没有进行任何处理,且使用相同的编码器设置,将JPEG重新编码为JPEG并不会损失两次信息。JPEG过程是确定性的,并且将其应用两次与一次应用时产生相同的结果。此视频有一个不错的解释(关键语句约在5:00处)。 - marcelm
1个回答

65

JPEG质量有两个部分。第一个是已经设置为最高可能值的quality设置。

JPEG还使用色度子采样,假设颜色色调变化不如亮度变化重要,并且一些信息可以安全地丢弃。不幸的是,在苛刻的应用中,这并不总是正确的,你最容易在红色边缘上注意到这一点。PIL最初没有公开文档设置来控制这个方面。

Pascal Beyeler发现了禁用色度子采样的选项。当保存图像时,您可以设置subsampling=0,图像看起来更清晰!

im.save('/path/to/cover-2.jpg', format='JPEG', subsampling=0, quality=100)

Pillow 项目在 PIL 停止更新后接管并作出了许多改进,包括记录以前未记录的 subsampling 选项。现在已经升级为可以接受整数或字符串参数,但我仍然建议使用如上所示的 0。该项目与编程有关。

https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#jpeg

请注意,文档声称quality=95是最佳质量设置,应避免使用超过95的任何设置。这可能与早期版本的PIL有所不同。

1
谢谢您的回答。考虑到它现在已经快10年了,使用subsampling=0在使用pillow调整图像大小时仍然推荐吗? - Crashalot
@Crashalot 目前 Pillow 9.4.0 的文档仍然说明 0 对应于 '4:4:4',这意味着完全没有子采样。对于需要近距离查看的图像来说,这非常重要,我自己的 JPEG 图像也不会使用其他任何选项。 - Mark Ransom
@Crashalot,Pillow 9.4.0的当前文档仍然说明0对应于'4:4:4',这意味着完全没有亚采样。这对于需要近距离查看的图像至关重要,对于我自己的JPEG图像,我不会使用其他任何选项。 - undefined
有没有机会把这个答案整理一下?它可以单独成为一个帖子。 - Thomas Weller
@ThomasWeller 你说得没错。10年前我写这个答案时,PIL的状态一团糟,但我相信现在情况已经平息了。我需要一些时间来处理它。 - Mark Ransom
@ThomasWeller 我觉得我已经整理好了,你看看怎么样。我也会删除我的评论。 - Mark Ransom

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