每个https://stackoverflow.com/a/17822099/1639359使用resample=PIL.Image.BICUBIC应该通过旋转来保持质量。这个问题是根据我对上述答案的评论而提出的,我认为这并不适用于我。
我们有哪些Python和PIL版本:
import sys
print(sys.version)3.7.3 (default, Mar 27 2019, 22:11:17)
[GCC 7.3.0]import PIL
import PIL.Image
print(PIL.__version__)
print(PIL.Image.__version__)6.2.1
6.2.1打开我们的测试映像并保存它。
注意质量的损失;保存的文件比原始文件要小得多:
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'-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'可防止保存时质量下降:
img.save('testsave.jpg',"jpeg",exif=holdexif,quality='keep')
%ls -l 'test_image.jpg'
%ls -l 'testsave.jpg'-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 disappearsresample=PIL.Image.BICUBIC)print(img.format)JPEGrotated_img = img.rotate(-90,resample=PIL.Image.BICUBIC,expand=True)print(img.format)
print(rotated_img.format)JPEG
None保存旋转文件显示质量下降:
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'-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。
至于“判断质素的唯一好方法”是“看图像本身”,我当然可以绝对理解。然而,在相对的基础上,最值得注意的是,当比较一些处理前后的“同一”图像时,在我看来,可能有办法实际测量或至少估计处理前后的质量差异。(当然,我对图像还不太了解,不知道什么是最好的方法,因此我提出问题的部分原因)。在我看来(至少从我初学者的角度来看),很多时候人们会想要做任何想要做的事情,而同时又很少或不损失质量。感谢您的耐心和帮助,填补了我的知识空白,并用答案。
发布于 2021-02-02 04:50:15
通常,任何图像旋转都会导致图像质量的损失,仅仅是因为输出需要对不从输入到输出映射1:1的像素的输入进行插值。对于90度倍数的旋转,可以得到1:1的映射,并进行无损旋转。目前还不清楚PIL/Pillow是否聪明到足以做到这一点,但它有可能。你的例子旋转了-90度,这样你就能幸运了。
元数据正在丢失,因为rotate生成一个新的映像,它不会修改现有的映像。要确定哪些元数据可能与新映像相关并不容易,因此最安全的操作方法就是不复制任何元数据。正如您已经发现的,手动复制任何您认为重要的内容都是可能的。我认为没有办法自动复制任何东西。
正如注释中所指出的,使用文件大小来判断图像质量是一个非常糟糕的指标。较小的尺寸意味着质量较差,但不必如此;JPEG压缩的整个前提是,一些图像退化在正常的观看中根本看不见。视觉比较是最终的考验。如果你必须有一个自动化的比较,有方法这样做,但我认为没有任何出现作为无可争议的最佳比较方法。
发布于 2022-06-08 20:37:17
您旋转了图像,这将创建一个新的通用映像。在这种情况下没有“保持”。保存到JPEG时,默认质量为75,高质量为95。
需要将质量(可能是表和元数据)复制到新映像中,就像您对Exif所做的一样。
https://stackoverflow.com/questions/59504849
复制相似问题