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

我使用 PIL 调整大小的图像有转换较大的图像到较小的。有没有什么标准的方法可以减少图像的文件大小,同时又不会损失太多的质量?假设图像的原始大小为100kB。我想把它降低到5或10kB,特别是对于 PNG 和 JPEG 格式。

201064 次浏览

见图像模块的 缩略图功能。您可以使用它将较小版本的文件保存为不同的文件类型,如果您希望尽可能保持高质量,可以考虑在这样做时使用 ANTIALIAS过滤器。

除此之外,我不确定是否有一种方法可以指定所需的最大尺寸。当然,您可以编写一个函数,该函数可以尝试以不同的质量保存文件的多个版本,直到满足一定的大小,丢弃其余的版本,并给出您想要的图像。

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

 from PIL import Image


foo = Image.open('path/to/image.jpg')  # My image is a 200x374 jpeg that is 102kb large
foo.size  # (200, 374)
 

# 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.9 kb 可能看起来不多,但是在成百上千的图片中,它可以累加起来。

现在尝试将它降低到5kb 到10kb,您可以在保存选项中更改质量值。 Using a quality of 85 instead of 95 in this case would yield: 未优化: 15.1 kb 优化: 14.3 kb 使用质量为75(如果省略参数,则默认为75)将产生: 未优化: 11.8 kb 优化: 11.2 kb

我更喜欢质量85与优化,因为质量没有受到太大的影响,而且文件大小更小。

假设你有一个名为 Book 的模型,在它上面有一个名为‘ cover _ pic’的字段, in that case, you can do the following to compress the image:

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中的主要映像管理器是 PILImage模块。

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)

只是为了告诉你什么是(几乎)通常做的水平图像。 For vertical images you might do:

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

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

如果你有一个胖 png (1MB 的400x400等等) :

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

可以调整图像的大小,也可以降低图像质量。 这里附上几个例子:

Python PIL resize image

from PIL import Image
WIDTH = 1020
HEIGHT = 720
img = Image.open("my_image.jpg")
resized_img = img.resize((WIDTH, HEIGHT))
resized_img.save("resized_image.jpg")

更改图像分辨率枕头

from PIL import Image
size = 7016, 4961
im = Image.open("my_image.png")
im_resized = im.resize(size, Image.ANTIALIAS)
im_resized.save("image_resized.png", "PNG")

OR you can use

im_resized.save("image_resized.png", quality=95, optimize=True)

This script will reduce your image's width and height, with saving it's proportion, and reducing size also

two options,他们做相同的逻辑,first one is how i did in django projectsecond is on pure python

您可以根据需要的宽度更改 TARGET_WIDTH

in django models.py after image saved, it will be proccessed again

from PIL import Image


class Theme(models.Model):
image = models.ImageField(upload_to='theme_image/')
    

def save(self, *args, **kwargs):
super().save(*args, **kwargs)
this_image = Image.open(self.image.path)
width, height = this_image.size
TARGET_WIDTH = 500
coefficient = width / 500
new_height = height / coefficient
this_image = this_image.resize((int(TARGET_WIDTH),int(new_height)),Image.ANTIALIAS)
this_image.save(self.image.path,quality=50)

没有姜戈 foo.py:

from PIL import Image


this_image = Image.open("path\to\your_image.jpg")
width, height = this_image.size
TARGET_WIDTH = 500
coefficient = width / 500
new_height = height / coefficient
this_image = this_image.resize((int(TARGET_WIDTH),int(new_height)),Image.ANTIALIAS)
this_image.save("path\where\to_save\your_image.jpg",quality=50)