使用 PIL 保存图像两次
Saving image twice using PIL
如果我使用 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.jpg
和 test2.jpg
图片会略有不同。这意味着,在您打开(解压缩)并使用有损 JPEG 压缩保存(再次压缩)后,存储在 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 次循环才能达到稳定状态(打开和保存图像不会产生任何损失)。但是,最终 "steady" 图像与原始图像明显不同。
第一次JPG压缩后的图片:
经过 115 compress/decompress 个循环后得到的 "steady" 图像:
示例输出:
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,如您所见,多次重复 compression/decompression 使图像失去了颜色和清晰度。即使质量设置为 100,结果也会非常相似,尽管文件大小几乎是原来的两倍。
如果我使用 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.jpg
和 test2.jpg
图片会略有不同。这意味着,在您打开(解压缩)并使用有损 JPEG 压缩保存(再次压缩)后,存储在 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 次循环才能达到稳定状态(打开和保存图像不会产生任何损失)。但是,最终 "steady" 图像与原始图像明显不同。
第一次JPG压缩后的图片:
经过 115 compress/decompress 个循环后得到的 "steady" 图像:
示例输出:
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,如您所见,多次重复 compression/decompression 使图像失去了颜色和清晰度。即使质量设置为 100,结果也会非常相似,尽管文件大小几乎是原来的两倍。