【发布时间】:2017-03-28 00:10:57
【问题描述】:
编辑:这个问题已被标记为重复?我的问题显然是关于优化这个过程,而不是如何去做。我什至提供了代码来证明我已经弄清楚了后者。在你标记它们之前,你的互联网大厅监视器是否甚至阅读了这些问题的标题?
我有以下代码块来使用 PIL 压缩图像,直到所述图像小于一定大小。
from PIL import Image
import os
def compress(image_file, max_size, scale):
while os.path.getsize(image_file) > max_size:
pic = Image.open(image_file)
original_size = pic.size
pic = pic.resize((int(original_size[0] * scale),
int(original_size[1] * scale)),
Image.ANTIALIAS)
pic.save(image_file, optimize=True, quality=95)
在这段代码中,我使用os.path.getsize(image_file) 来获取图像的大小。但是,这意味着文件必须在每次循环运行时保存在pic.save(image_file, optimize=True, quality=95。
这个过程需要很长时间。
有没有办法通过获取PIL Image 对象pic 中的图像大小来优化这一点?
【问题讨论】:
-
不清楚您要做什么。循环调整图像大小,因此需要保存。如果您想要的只是大小信息,请不要调整大小或保存文件。
-
我假设您保存为 JPEG。您可以通过将文件数据保存到内存中的 BytesIO 对象而不是磁盘来节省一些时间。这也将使获得结果文件大小的速度更快。但是,它不会加快编码过程。顺便说一句,使用质量 95 没有多大意义。它非常慢,它产生的文件很大,而且 90 和 95 之间的视觉差异很少被注意到。而且 85 通常就足够了,具体取决于图像的性质。
-
我还应该提到 PIL / Pillow 中的图像缩放例程质量不是很高,尽管您可能不会注意到如果图像足够大并且是具有许多平滑色调过渡的照片而不是计算机生成的具有许多高对比度区域的图像。此外,您应该不逐步编辑 JPEG。不要保存缩放的图像,然后重新加载它,并重新缩放已经缩放的图像。这样你会很快失去质量。如果您必须尝试不同的比例,直到文件大小足够小,请从原始文件生成每个新版本。
标签: python image python-3.x python-imaging-library