如何使用PIL减小图像文件大小

时间:2012-05-15 19:26:01

标签: python image compression python-imaging-library

我正在使用PIL通过将较大的图像转换为较小的图像来调整图像的大小。有没有任何标准的方法来减少图像的文件大小而不会过多地损失质量,让我们说图像的原始大小是100KB,我想把它降低到5或10 KB,特别是对于png和jpeg格式。

5 个答案:

答案 0 :(得分:81)

用于保存JPEG和PNG的内置参数是optimize

 >>> from PIL import Image
 # My image is a 200x374 jpeg that is 102kb large
 >>> foo = Image.open("path\\to\\image.jpg")
 >>> foo.size
  (200,374)
 # I downsize the image with an ANTIALIAS filter (gives the highest quality)
 >>> foo = foo.resize((160,300),Image.ANTIALIAS)
 >>> foo.save("path\\to\\save\\image_scaled.jpg",quality=95)
 # The saved downsized image size is 24.8kb
 >>> foo.save("path\\to\\save\\image_scaled_opt.jpg",optimize=True,quality=95)
 # The saved downsized image size is 22.9kb

optimize标志将对图像进行额外传递,以找到尽可能减小其大小的方法。 1.9kb可能看起来不多,但是数百/数千张图片可以加起来。

现在尝试将其降低到5kb到10 kb,您可以更改保存选项中的质量值。 在这种情况下,使用85而不是95的质量将产生: 未经优化:15.1kb 优化:14.3kb 使用75的质量(如果省略参数,则默认)将产生: 未经优化:11.8kb 优化:11.2kb

我更喜欢优质85,因为质量不会受到太大影响,文件大小要小得多。

答案 1 :(得分:9)

假设您有一个名为Book的模型,并在其上有一个名为'cover_pic'的字段, 在这种情况下,您可以执行以下操作来压缩图像:

from PIL import Image
b = Book.objects.get(title='Into the wild')
image = Image.open(b.cover_pic.path)
image.save(b.image.path,quality=20,optimize=True)

希望对任何绊倒它的人都有所帮助。

答案 2 :(得分:1)

请参阅PIL图像模块的thumbnail功能。您可以使用它来保存较小版本的文件作为各种文件类型,如果您希望保留尽可能多的质量,请考虑使用ANTIALIAS过滤器。

除此之外,我不确定是否有办法指定所需的最大尺寸。当然,您可以编写一个函数,可以尝试以不同的质量保存文件的多个版本,直到达到一定的大小,丢弃其余部分并为您提供所需的图像。

答案 3 :(得分:0)

PIL中的主要图像管理器是PIL的{​​{1}}模块。

Image

您可以在要进一步减小大小的参数中添加from PIL import Image import math foo = Image.open("path\\to\\image.jpg") x, y = foo.size x2, y2 = math.floor(x-50), math.floor(y-20) foo = foo.resize((x2,y2),Image.ANTIALIAS) foo.save("path\\to\\save\\image_scaled.jpg",quality=95) ,但优化仅适用于JPEG和PNG。 对于其他图像扩展名,您可能会降低新保存图像的质量。 您可以通过删除一些代码并定义图像大小来更改新图像的大小,并且只有仔细查看代码,才能弄清楚如何做到这一点。 我定义了这个大小:

optimize=True

仅向您展示水平图像通常(几乎)完成的操作。 对于垂直图像,您可以这样做:

x, y = foo.size
x2, y2 = math.floor(x-50), math.floor(y-20)

。记住,您仍然可以删除那段代码并定义一个新的大小。

答案 4 :(得分:-5)

如果您有一个胖 png(400x400 等为 1MB):

__import__("importlib").import_module("PIL.Image").open("out.png").save("out.png")