当前位置: 首页 > 面试题库 >

确定Python(PIL)中的JPG质量

段劲
2023-03-14
问题内容

我正在玩Python中的PIL库,并且想知道如何确定给定JPG图像的质量。我尝试打开JPG图像并对其进行处理,然后再次保存为原始质量。Image.save让我确定所需的质量:

im.save(name, quality = x)

但我看不出有任何方法可以提取原始内容。现在,我只是在猜测,并通过对’quality’参数进行二进制搜索来尝试具有与输入大小相同的输出文件,但这不是长期可接受的解决html" target="_blank">方法:)
我也尝试使用:Image.info但大多数图像那里没有任何有用的信息(例如:“ adobe”,“ icc_profile”,“ exif”,“
adobe_transform”)
帮助!


问题答案:

在PIL(以及大多数使用libjpeg的所有软件/库)中,质量设置用于构建量化表(参考)。在libjpeg中,质量编号“缩放”样本表值(来自JPEG规范K.1节)。在其他类别中,有不同的表分配给不同的质量(例如:Photoshop,数码相机)。

因此,换句话说,质量等于量化表,因此它比数字更复杂。

如果要以相同的“质量”保存修改图像,则只需使用相同的量化表。幸运的是,量化表被嵌入到每个JPEG中。不幸的是,在保存为PIL时无法指定量化表。cjpeg,libjpeg附带的命令行实用程序可以做到这一点。

这是一些用指定的量化表保存jpeg的粗略代码:

from subprocess import Popen, PIPE
from PIL import Image, ImageFilter

proc = Popen('%s -sample 1x1 -optimize -progressive -qtables %s -outfile %s' % ('path/to/cjpeg', '/path/ta/qtable', 'out.jpg'), shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
P = '6'
if im.mode == 'L':
    P = '5'
stdout, stderr = proc.communicate('P%s\n%s %s\n255\n%s' % (P, im.size[0], im.size[1], im.tostring()))

您将需要找到从原始jpeg提取量化表的方法。djpeg可以做到这一点(libjpeg的一部分):

djpeg -verbose -verbose image.jpg > /dev/null

您还需要查找并设置采样。有关更多信息,请点击此处。你也可以看看test_subsampling

更新

我做了一个PIL分支,以添加在保存JPEG时指定子采样表或量化表或同时指定两者的可能性。您还可以指定quality='keep'保存的时间,并且将使用与原始图像相同的量化表和二次采样来保存图像(原始图像必须为JPEG)。保存时还有一些预设(基于Photoshop)可以传递给质量。我的叉子

更新2

我的代码现在是Pillow 2.0的一部分。所以做:

pip install Pillow


 类似资料:
  • 问题内容: 只是想编辑一些代码,以使输出jpg质量不是默认的低质量设置, .....当前正在使用。 我看过其他一些设置质量的Java示例,但对Java不太熟悉,我在理解如何插入东西和重做一些示例方面遇到了麻烦,这些示例在使用Java设置图像质量方面已经见过。 这是我要开始工作的代码........ 问题答案: 终于用这段代码做到了…

  • 我使用的是由termqueries构造的booleanquery,它们都位于同一个字段上,目前都设置在“should”上。 我已经试图弄清楚这个查询的ScoreDoc[]结果对象的排名是如何工作的,但没有找到正确的文档,也许您可以帮助解决以下问题:

  • crf 20是相当高的质量,接近100%,恢复的帧应该接近原始。视频播放器暂停帧显示足够的质量。(虽然我不能说它是否在关键帧上) ffmpeg版本信息:

  • 所以我想找到关于欧拉计划的问题3的答案。我需要确定给定数的最大素数因子。 引述欧拉项目:“13195的素数因子是5、7、13和29。600851475143中最大的素数因子是什么?” 我已经构建了我的代码,它在任何int大小的东西上都能完美地工作。但是由于它们给出的巨大数字,我的代码存在转换问题。 起初,我尝试切换到长变量和长数组,但我得到了错误:“可能从long到int的有损转换” 那么,我如何

  • 问题内容: 用PIL(1.1.7)创建的JPEG图像质量很差。这是一个例子: 输入:https : //s23.postimg.cc/8bks3x5p7/cover_1.jpg 输出:https : //s23.postimg.cc/68ey9zva3/cover_2.jpg 输出图像是使用以下代码创建的: 红色文字看起来真的很糟糕。使用GIMP或Photoshop保存图像甚至不能接近PIL所产生

  • 问题内容: 假设我想在python中编写一个非常简单的程序,该程序指示按下键的时间。因此,如果我键入并按住片刻不放,我希望编写一个能够显示类似信息的程序。 据我了解,应该通过检测并标记KEYDOWN事件和KEYUP事件并加时间戳,并适当减去时间戳来实现。因此,检测到KEYDOWN和KEYUP事件就足够了。 关于SO的检测和按键检测或单个字符输入检测等各种各样的问题和答案,都使用某种形式的getch