我将图像保存到剪贴板,并且当我从剪贴板读取图像信息并将其保存在本地时,图像质量发生了变化。如何保存它以保持原始高质量?
from PIL import ImageGrab
im = ImageGrab.grabclipboard()
im.save('somefile.png','PNG')
我尝试在'quality=95'
中添加参数im.save()
,但是没有用。原始图像质量为131K,保存的图像为112K。
答案 0 :(得分:1)
文件的大小与图像的质量没有直接关系。这也取决于编码器的工作效率。由于是PNG,该过程是无损的,因此您不必担心-质量得以保留。
请注意,保存JPEG文件和PNG文件时,quality
参数的含义不同:
对于JPEG文件,如果指定较低的质量,则实际上是在允许编码器放弃更多信息并放弃图像质量,以换取较小的文件大小。
使用PNG,您的编码和解码是无损的。质量是对解码器的提示,表明需要花费多少时间压缩文件(总是无损压缩)以及最适合的过滤/编码类型。它更类似于gzip
或--best
的{{1}}的参数。
有关PNG格式的其他信息是here on Wikipedia。
如果不分析两个图像的内容,就无法说出尺寸不同的原因-可能有很多原因:
一个编码器可能已经注意到图像包含的颜色少于256种,因此决定使用调色板,而另一种可能没有。这样可以使图像大小相差3倍,而质量却是相同的。
一个编码器可能使用更大的缓冲区,并花费更长的时间查找图像中的重复图案。举一个简单的例子,假设图像的宽度为32,000像素,并且每行与上面的相同。如果一个编码器使用8kB缓冲区,则永远无法发现图像只是在页面上反复播放,因此它必须对每一行进行完整编码,而具有64kB缓冲区的编码器可能仅能在每个页面上使用1个字节。并使用PNG过滤说出“与上方的行相同” 。
一个编码器可能会出于代码简单或代码空间不足的原因而决定始终将数据编码为16位版本,即使它只能使用8位。
一个编码器可能会决定即使它是不透明的,也总是要存储一个alpha层,因为这可能会使代码/数据更简洁。
一个编码器可能总是选择不进行过滤,而另一个编码器具有执行--fast
,sub
,up
或average
过滤所需的代码。
一个编码器可能没有足够的内存来容纳整个图像,因此它可能必须使用一种简单的方法来确保它可以处理以后在图像流中出现的所有内容。
我只是编造了这些示例-不要把它们当作福音-我只是想说明一些可能性。
答案 1 :(得分:0)
要从剪贴板复制文件的精确副本,唯一的方法是剪贴板包含原始字节的逐字节副本。当内容来自程序中的“复制”功能时,不会发生这种情况。
从理论上讲,可以通过设置带有原始文件副本的blob型对象来创建一个程序来实现此目的,但是这样做效率极低,并且无法达到剪贴板的目的。
一些要点:
-使用文件管理器复制到剪贴板时,剪贴板将具有对原始文件的引用(不是对整个文件的引用,整个文件可能比ram大得多)
-大多数程序会将剪贴板内容设置为显示或所选数据的某些“有用版本”。该程序的创建者非常需要对此进行解释。
-读取图像时解析剪贴板内容再次受到用于处理数据并将其打包回图像格式的库的异想天开。
通常,如果您想精确复制文件,最好复制原始文件。
已经说过:评估复制粘贴过程的目的,并确定从剪贴板获取的数据是否“足够好”以达到预期目的。显然,这取决于您要使用它的目的。