python-2.7 - 使用 PIL 保存图像两次

标签 python-2.7 image-processing python-imaging-library image-compression

如果我使用 PIL 以相同的图像质量保存图像两次,会发生什么情况。

from PIL import Image

quality = 85

# Open original image and save 
img = Image.open('image.jpg')
img.save('test1.jpg', format='JPEG', quality=quality)

# Open the saved image and save again with same quality
img = Image.open('test1.jpg')
img.save('test2.jpg', format='JPEG', quality=quality)

图像尺寸或图像质量几乎没有差异。

我是否可以假设以相同质量多次保存图像不会影响实际图像质量并且这样做是安全的?

此外,如果我以 85% 质量保存图像,然后以 95% 质量打开并保存,图像尺寸会变得更大。这是否意味着 PIL 将图像解压缩并再次压缩?

最佳答案

在大多数情况下,您的 test1.jpgtest2.jpg 图像会略有不同。这意味着,当您打开(解压缩)并使用有损 JPEG 压缩保存(再次压缩)test1.jpg 时,存储在 test1.jpg 中的信息将会丢失。

但是,在某些情况下,使用相同的软件打开和存储 JPEG 图像不会带来任何变化。

看一下这个例子:

from PIL import Image
import os
import hashlib

def md5sum(fn):
    hasher = hashlib.md5()
    with open(fn, 'rb') as f:
        hasher.update(f.read())
        return hasher.hexdigest()

TMP_FILENAME = 'tmp.jpg'

orig = Image.open(INPUT_IMAGE_FILENAME)
orig.save(TMP_FILENAME)     # first JPG compression, standard quality

d = set()
for i in range(10000):

    # Compute file statistics
    file_size = os.stat(TMP_FILENAME).st_size
    md5 = md5sum(TMP_FILENAME)
    print ('Step {}, file size = {}, md5sum = {}'.format(i, file_size, md5))
    if md5 in d: break
    d.add(md5)

    # Decompress / compress
    im = Image.open(TMP_FILENAME)
    im.save(TMP_FILENAME, quality=95)

它将重复打开和保存 JPG 文件,直到找到循环(意味着打开的图像具有与之前完全相同的数据)。

在我的测试中,需要 50 到 700 个周期才能达到稳定状态(当打开和保存图像不会产生任何损失时)。然而,最终的“稳定”图像与原始图像明显不同。

首次 JPG 压缩后的图像:

Coke can lying on a beach in Ukraine

115 次压缩/解压缩周期后生成的“稳定”图像:

Coke can lying on a beach in Ukraine (faded colors, lost sharpness)

示例输出:

Step 0, file size = 38103, md5sum = ea28705015fe6e12b927296c53b6d147
Step 1, file size = 71707, md5sum = f5366050780be7e9c52dd490e9e69316
...
Step 113, file size = 70050, md5sum = 966aabe454aa8ec4fd57875bab7733da
Step 114, file size = 70050, md5sum = 585ecdd66b138f76ffe58fe9db919ad7
Step 115, file size = 70050, md5sum = 585ecdd66b138f76ffe58fe9db919ad7

因此,即使我使用了相对较高的质量设置 95,如您所见,多次重复压缩/解压缩也会使图像失去其颜色和清晰度。即使质量设置为 100,结果也将非常相似,尽管文件大小几乎是两倍。

关于python-2.7 - 使用 PIL 保存图像两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50815632/

相关文章:

python - python 2.7 中的网络带宽测试或速度测试

python - 将数据框写入带有宽列的Excel

python - 如何在不计算边界外数据的情况下使用 SciPy Image 应用统一过滤器?

python - 在 Windows 7 64 位 PC 上安装 PIL

python - Django 虽然已安装但找不到 Pillow

python - 将opencv图像格式转换为PIL图像格式?

python - Numpy 导入抛出 AttributeError : 'module' object has no attribute 'core'

Python SocketServer 收不到所有数据

Haskell 图像处理库?

c++ - 我在 C++ 中的二维数组高斯模糊函数有什么问题?