我正在使用 PIL 通过将较大的图像转换为较小的图像来调整图像的大小。是否有任何标准方法可以在不损失太多质量的情况下减小图像的文件大小,假设图像的原始大小为 100KB,我想将其缩小到 5 或 10 KB,尤其是对于 png 和 jpeg 格式。
6 回答
A built-in parameter for saving JPEGs and PNGs is 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
The optimize
flag will do an extra pass on the image to find a way to reduce its size as much as possible. 1.9kb might not seem like much, but over hundreds/thousands of pictures, it can add up.
Now to try and get it down to 5kb to 10 kb, you can change the quality value in the save options. Using a quality of 85 instead of 95 in this case would yield: Unoptimized: 15.1kb Optimized : 14.3kb Using a quality of 75 (default if argument is left out) would yield: Unoptimized: 11.8kb Optimized : 11.2kb
I prefer quality 85 with optimize because the quality isn't affected much, and the file size is much smaller.
假设您有一个名为 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 的 Image Module 的缩略图功能。您可以使用它将较小版本的文件保存为各种文件类型,如果您想尽可能多地保留质量,请考虑ANTIALIAS
在这样做时使用过滤器。
除此之外,我不确定是否有办法指定最大所需大小。当然,您可以编写一个函数,尝试以不同的质量保存文件的多个版本,直到满足特定大小,丢弃其余的并为您提供所需的图像。
主要的图像管理器PIL
是PIL
'sImage
模块。
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)
. 请记住,您仍然可以删除那段代码并定义新的大小。
您可以调整图像大小,也可以降低图像质量。这里附上几个例子:
Python PIL调整图像大小
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")
或者你可以使用
im_resized.save("image_resized.png", quality=95, optimize=True)
如果你有一个胖 png(1MB 用于 400x400 等):
__import__("importlib").import_module("PIL.Image").open("out.png").save("out.png")