猿问

如何提高函数'image.save()'的质量?

我将图像保存到剪贴板,当我从剪贴板读取图像信息并保存到本地时,图像质量发生了变化。我怎样才能保存它以保持原来的高质量?


from PIL import ImageGrab

im = ImageGrab.grabclipboard()

im.save('somefile.png','PNG')

我尝试添加的参数'quality=95'中im.save(),但没有奏效。原始图像质量为131K,保存的图像为112K。


神不在的星期二
浏览 445回答 2
2回答

阿波罗的战车

文件的大小与图像的质量没有直接关系。它还取决于编码器的工作效率。由于它是 PNG,因此过程是无损的,因此您无需担心 - 质量得以保留。请注意,quality保存 JPEG 文件与 PNG 文件时,该参数具有不同的含义:对于 JPEG 文件,如果您指定较低的质量,您实际上是在允许编码器丢弃更多信息并放弃图像质量以换取较小的文件大小。使用 PNG,您的编码和解码是无损的。质量是解码器关于压缩文件(始终无损)花费多少时间以及可能最适合的过滤/编码类型的提示。它更类似于参数gziplike--best或--fast。有关 PNG 格式的更多信息,请访问 Wikipedia。如果不分析这两个图像的内容,就不可能说出尺寸不同的原因——可能有很多原因:一个编码器可能已经注意到图像包含少于 256 种颜色,因此决定使用调色板,而另一个可能没有这样做。这可能会使图像大小相差 3 倍,但质量却是相同的。一个编码器可能会使用更大的缓冲区并花费更长的时间来寻找图像中的重复模式。举一个简单的例子,假设图像宽 32,000 像素,每条线都与上面的相同。如果一个编码器使用 8kB 缓冲区,它永远不会发现图像只是在页面上一遍又一遍地重复,因此它必须完整编码每一行,而具有 64kB 缓冲区的编码器可能只能使用 1 个字节行并使用 PNG 过滤说“与上面的行相同”。一个编码器可能会基于代码的简单性或缺乏代码空间而决定始终以 16 位版本对数据进行编码,即使它只能使用 8 位。一个编码器可能会决定它总是要存储一个 alpha 层,即使它是不透明的,因为这可能会使代码/数据更简单。一个编码器可总是选择这样做没有过滤,而其他必须做所需的代码sub,up,average或Paeth过滤。一个编码器可能没有足够的内存来保存整个图像,因此它可能必须使用一种简单的方法来确保它可以处理图像流中稍后出现的任何内容。我只是编造了这些例子——不要认为它们是福音——我只是想说明一些可能性。

猛跑小猪

要从剪贴板复制文件的精确副本,唯一的方法是剪贴板是否包含原始文件的逐字节副本。当内容来自程序中的“复制”功能时,不会发生这种情况。从理论上讲,可以通过设置带有原始文件副本的 blob 类型对象来创建程序来执行此操作,但这会非常低效并且会破坏剪贴板的目的。一些要点:- 当您使用文件管理器复制到剪贴板时,剪贴板将引用原始文件(不是整个文件,可能比 ram 大得多)- 大多数程序会将剪贴板内容设置为“有用的版本”显示或选择的数据。这在很大程度上取决于程序创建者的解释。- 在读取图像时解析剪贴板内容再次受到用于处理数据并将其打包成图像格式的库的奇思妙想。通常,如果您想完全复制文件,最好只复制原始文件。话虽如此:评估复制粘贴过程的目的,并决定您从剪贴板获得的数据是否“足够好”用于预期目的。这显然取决于你想用它做什么。
随时随地看视频慕课网APP

相关分类

Python
我要回答