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


78

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


您将质量损失定义为“太多”了吗?如果要将文件大小减少10到20倍,最简单的方法是减少像素数量。将宽度和高度都减小2/3,就可以得到大约原始尺寸1/9的图片。但是,您松开了很多分辨率。
罗兰·史密斯

Answers:


132

用于保存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至10kb,您可以在保存选项中更改质量值。在这种情况下,使用质量85而不是95将产生:未优化:15.1kb优化:14.3kb使用质量75(如果省略了参数,则为默认值)将产生:未优化:11.8kb优化:11.2kb

我更喜欢使用质量85进行优化,因为质量不会受到太大影响,并且文件大小要小得多。


4
ANTIALIAS方法名称更新:从2.7.0开始,所有调整大小的方法都是ANTIALIAS,而特定ANTIALIAS过滤器的真实(新)名称是LANCZOS。(目前还保留了抗锯齿以实现向后兼容性) pillow.readthedocs.io/en/3.0.x/releasenotes/…–
hbrannan

22

假设您有一个名为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)

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


5

中的主要图像管理器PILPILImage模块。

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)

您可以添加optimize=True要进一步减小大小的参数,但优化仅适用于JPEG和PNG。对于其他图像扩展名,您可能会降低新保存图像的质量。您可以通过删除一些代码并定义图像大小来更改新图像的大小,并且只有仔细查看代码,才能弄清楚如何做到这一点。我定义了这个大小:

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

只是为了向您展示水平图像通常(几乎)完成的操作。对于垂直图像,您可以执行以下操作:

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

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


3

请参阅PIL图像模块的缩略图功能。您可以使用它来将较小版本的文件保存为各种文件类型,如果要保持尽可能高的质量,请在使用ANTIALIAS时考虑使用过滤器。

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


1
有没有一种方法可以通过保持尺寸恒定,特别是减小文件大小。用于png格式。
Yashwanth Kumar 2012年

1
如果要保持相同的尺寸,您可以尝试的另一件事是在保存图像时设置质量设置。看看这个答案
Cryptite 2012年

1
但是quality属性对于png格式没有影响。即使我更改质量,文件大小也保持不变。
Yashwanth Kumar

在那种情况下,我恐怕不知道。传统上,PNG由于其压缩格式而尺寸较大。PNG是必须的吗?如果您没有考虑过尝试GIF?
Cryptite 2012年

对于PNG,请将图像转换为使用较小的调色板。写入文件时,请使用值小于8的“位”选项。
罗兰·史密斯

0

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

__import__("importlib").import_module("PIL.Image").open("out.png").save("out.png")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.