首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么PIL.Image.rotate()不顾`resample=Image.BICUBIC`而导致质量下降?

为什么PIL.Image.rotate()不顾`resample=Image.BICUBIC`而导致质量下降?
EN

Stack Overflow用户
提问于 2019-12-27 18:45:17
回答 2查看 1.7K关注 0票数 2

每个https://stackoverflow.com/a/17822099/1639359使用resample=PIL.Image.BICUBIC应该通过旋转来保持质量。这个问题是根据我对上述答案的评论而提出的,我认为这并不适用于我。

我们有哪些Python和PIL版本:

代码语言:javascript
复制
import sys
print(sys.version)
代码语言:javascript
复制
3.7.3 (default, Mar 27 2019, 22:11:17)
[GCC 7.3.0]
代码语言:javascript
复制
import PIL
import PIL.Image
print(PIL.__version__)
print(PIL.Image.__version__)
代码语言:javascript
复制
6.2.1
6.2.1

打开我们的测试映像并保存它。

注意质量的损失;保存的文件比原始文件要小得多:

代码语言:javascript
复制
img = PIL.Image.open('test_image.jpg')
holdexif = img.info['exif']
img.save('testsave.jpg',"jpeg",exif=holdexif)

%ls -l 'test_image.jpg'
%ls -l 'testsave.jpg'
代码语言:javascript
复制
-rwxrwxrwx 1 dino dino 1926859 Dec 24 21:28 test_image.jpg*
-rwxrwxrwx 1 dino dino 452343 Dec 27 13:16 testsave.jpg*

Determining JPG quality in Python (PIL)

设置quality='keep'可防止保存时质量下降:

代码语言:javascript
复制
img.save('testsave.jpg',"jpeg",exif=holdexif,quality='keep')

%ls -l 'test_image.jpg'
%ls -l 'testsave.jpg'
代码语言:javascript
复制
-rwxrwxrwx 1 dino dino 1926859 Dec 24 21:28 test_image.jpg*
-rwxrwxrwx 1 dino dino 1926911 Dec 27 13:16 testsave.jpg*

如果我们旋转图像,就会发生两件事:

  • img.format disappears
  • quality显着减少(即使我们使用resample=PIL.Image.BICUBIC)

代码语言:javascript
复制
print(img.format)
代码语言:javascript
复制
JPEG
代码语言:javascript
复制
rotated_img = img.rotate(-90,resample=PIL.Image.BICUBIC,expand=True)
代码语言:javascript
复制
print(img.format)
print(rotated_img.format)
代码语言:javascript
复制
JPEG
None

保存旋转文件显示质量下降:

代码语言:javascript
复制
rotated_img.format="JPEG"  # quality='keep' will raise exception if format != 'JPEG'
rotated_img.save('testsave.jpg',"jpeg",exif=holdexif,quality='keep')
%ls -l 'test_image.jpg'
%ls -l 'testsave.jpg'
代码语言:javascript
复制
-rwxrwxrwx 1 dino dino 1926859 Dec 24 21:28 test_image.jpg*
-rwxrwxrwx 1 dino dino 450997 Dec 27 13:16 testsave.jpg*

问题:

1.我做错了什么?

2.为什么img.format在旋转时消失?还有什么在消失?

3.另外,是否有另一种检测质量损失的方法(我只知道保存该文件并看到它要小得多)。

在@MarkRansom的评论之后,我想为我的问题添加一些色彩:虽然我已经编码了很多年,但我只是在上周才开始处理图像。毫无疑问,我对图像处理的了解最多也是微乎其微,对于事物的工作方式存在重大的差距和误解。

也就是说,从编码的角度来看,我预计对象上的方法只会做该方法建议的事情,而不会产生副作用。例如,我希望旋转式()只能旋转图像,而不是同时清除元数据。即使为了效率起见,PIL包的默认行为是总是删除元数据,我也希望有一个选项(或者是全局的,或者是基于每种方法的),比如preserve_metadata=True

至于“判断质素的唯一好方法”是“看图像本身”,我当然可以绝对理解。然而,在相对的基础上,最值得注意的是,当比较一些处理前后的“同一”图像时,在我看来,可能有办法实际测量或至少估计处理前后的质量差异。(当然,我对图像还不太了解,不知道什么是最好的方法,因此我提出问题的部分原因)。在我看来(至少从我初学者的角度来看),很多时候人们会想要做任何想要做的事情,而同时又很少或不损失质量。感谢您的耐心和帮助,填补了我的知识空白,并用答案。

EN

回答 2

Stack Overflow用户

发布于 2021-02-02 04:50:15

通常,任何图像旋转都会导致图像质量的损失,仅仅是因为输出需要对不从输入到输出映射1:1的像素的输入进行插值。对于90度倍数的旋转,可以得到1:1的映射,并进行无损旋转。目前还不清楚PIL/Pillow是否聪明到足以做到这一点,但它有可能。你的例子旋转了-90度,这样你就能幸运了。

元数据正在丢失,因为rotate生成一个新的映像,它不会修改现有的映像。要确定哪些元数据可能与新映像相关并不容易,因此最安全的操作方法就是不复制任何元数据。正如您已经发现的,手动复制任何您认为重要的内容都是可能的。我认为没有办法自动复制任何东西。

正如注释中所指出的,使用文件大小来判断图像质量是一个非常糟糕的指标。较小的尺寸意味着质量较差,但不必如此;JPEG压缩的整个前提是,一些图像退化在正常的观看中根本看不见。视觉比较是最终的考验。如果你必须有一个自动化的比较,有方法这样做,但我认为没有任何出现作为无可争议的最佳比较方法。

票数 2
EN

Stack Overflow用户

发布于 2022-06-08 20:37:17

您旋转了图像,这将创建一个新的通用映像。在这种情况下没有“保持”。保存到JPEG时,默认质量为75,高质量为95。

需要将质量(可能是表和元数据)复制到新映像中,就像您对Exif所做的一样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59504849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档