2012-05-15 59 views
31

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

+0

你认为“太多”的质量损失是什么?如果要将文件大小减少10到20倍,最简单的方法就是减少像素数量。将宽度和高度减少2/3会给你一张约1/9原始尺寸的图片。但这是相当多的解决方案,你放松。 –

回答

1

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

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

+0

有没有办法通过保持尺寸不变尤其是减小文件大小。为png格式。 –

+1

如果您想要保持相同的尺寸,您可以尝试的另一件事是保存图像时设置质量设置。看看[这个答案](http://stackoverflow.com/a/1405701/369878) – Cryptite

+0

但质量属性没有差别的PNG formats.even我改变质量的文件大小保持不变。 –

54

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

# 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与优化,因为质量不受影响太大,文件大小更小。

8

可以说你有 在这种情况下,所谓的书并在其上的字段名为“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) 

希望它能帮助任何人磕磕绊绊之上。