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

Python 如何使用PIL减少图像文件大小,python,image,compression,python-imaging-library,Python,Image,Compression,Python Imaging Library,我正在使用PIL通过将较大的图像转换为较小的图像来调整图像的大小。有没有标准的方法可以在不损失太多质量的情况下减少图像的文件大小,比如说图像的原始大小是100KB,我想把它降低到5或10KB,特别是对于png和jpeg格式。参见PIL图像模块的功能。您可以使用它来保存文件的较小版本,作为各种文件类型,如果您希望保存尽可能多的质量,请考虑在使用时使用反别名< /代码>筛选器。 除此之外,我不确定是否有办法指定所需的最大尺寸。当然,您可以编写一个函数,该函数可以尝试以不同的质量保存文件的多个版本,直

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

参见PIL图像模块的功能。您可以使用它来保存文件的较小版本,作为各种文件类型,如果您希望保存尽可能多的质量,请考虑在使用时使用<代码>反别名< /代码>筛选器。
除此之外,我不确定是否有办法指定所需的最大尺寸。当然,您可以编写一个函数,该函数可以尝试以不同的质量保存文件的多个版本,直到达到一定的大小,放弃其余版本,并提供所需的图像。

保存JPEG和PNG的内置参数是
优化

来自PIL导入映像的
>>
#我的图像是200x374 jpeg,大小为102kb
>>>foo=Image.open(“path\\to\\Image.jpg”)
>>>foo.size
(200,374)
#我使用抗锯齿过滤器缩小图像大小(提供最高质量)
>>>foo=foo.resize((160300),Image.ANTIALIAS)
>>>保存(“路径\\to\\save\\image\u scaled.jpg”,质量=95)
#保存的缩小图像大小为24.8kb
>>>保存(“path\\to\\save\\image\u scaled\u opt.jpg”,optimize=True,quality=95)
#保存的缩小图像大小为22.9kb
optimize
标志将对图像执行额外的传递,以找到尽可能减小其大小的方法。1.9kb看起来可能不算多,但在数百/数千张图片中,它可以累加起来

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


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

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

希望它能帮助任何绊倒它的人。
PIL
中的主图像管理器是
PIL
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)
您可以向的参数添加
optimize=True
,以进一步减小大小,但optimize仅适用于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)
。请记住,您仍然可以删除该代码位并定义新的大小。

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


有没有办法通过保持尺寸不变(尤其是png格式)来减小文件大小。如果要保持相同的尺寸,唯一可以尝试的另一件事是在保存图像时设置质量设置。签出,但质量属性对png格式没有影响。即使我更改了质量,文件大小也保持不变。在这种情况下,恐怕我不知道。PNG由于其压缩格式,传统上尺寸更大。PNG是必须的吗?如果您没有考虑尝试将GIF用于PNG,请将图像转换为使用较小的调色板。写入文件时,使用值小于8的“位”选项。您将什么定义为“太多”质量损失?如果要将文件大小减少10到20倍,最简单的方法是减少像素数量。将宽度和高度都减小2/3会使图片的大小为原稿的1/9。但是这是一个很大的解决方案。ANTIALIAS方法名称更新:从2.7.0开始,所有调整大小的方法都是ANTIALIAS&特定ANTIALIAS过滤器的真实(新)名称是LANCZOS。(antialias当前为向后兼容而保留)
__import__("importlib").import_module("PIL.Image").open("out.png").save("out.png")