折腾:
【未解决】Python中实现二进制数据的图片的压缩
期间,需要去知道如何缩小图片,且保持宽高比例
python binary image compress
知道了,缩放图片,可以用resize
以及尽量保证图片画质不要减低太多
但是还要搞清楚如何保持原始的宽高比例
# The ‘quality’ option is ignored for PNG files
img.save(filename, quality=90, optimize=True)
pil image compress
out = im.resize((128, 128))
另外还要解决,压缩图片,缩放图片时,保持宽高比例
去看看resize是否有这种参数
python pillow resize fit ratio
image = Image.open(source_path) image.thumbnail(size, Image.ANTIALIAS)
默认模式是:BICUBIC
去看:
Filters
看不懂,不过看到:
貌似图片质量估计不错,所以就不去改默认模式了。
建议还是用:
im.thumbnail(size, Image.ANTIALIAS)
不过发现是:宽高竟然全部都是250×250
-》之前设置的宽高?-》难道之前原图就是正方形的?
怀疑是:Image.ANTIALIAS 强制没有保留宽高比?
# resampling filters NEAREST = NONE = 0 BOX = 4 BILINEAR = LINEAR = 2 HAMMING = 5 BICUBIC = CUBIC = 3 LANCZOS = ANTIALIAS = 1
后来证明:只是巧了,原图就是正方:(3543, 3543)
实际上是会保持原始比例的
从Pillow源码都可以看出来:
【总结】
最后没用resize,而是用thumbnail:
代码:
IMAGE_COMPRESS_SIZE = (600, 600) # imageFile.thumbnail(IMAGE_COMPRESS_SIZE, Image.ANTIALIAS) imageFile.thumbnail(IMAGE_COMPRESS_SIZE, Image.LANCZOS)
效果:
可以将图片:
从
1.3MB的1114×572
压缩为:
307KB的600×308
在设置了600×600的前提下,基本上压缩率在:23%左右,足够好了。
而关于压缩后的图片质量:
通过调试发现:
# resampling filters NEAREST = NONE = 0 BOX = 4 BILINEAR = LINEAR = 2 HAMMING = 5 BICUBIC = CUBIC = 3 LANCZOS = ANTIALIAS = 1
即:
LANCZOS = ANTIALIAS
所以改为:官网文档中提到的:LANCZOS
imageFile.thumbnail(IMAGE_COMPRESS_SIZE, Image.LANCZOS)
然后会:
保持尽量高的图片质量的,只不过压缩速度慢一点而已,此处不是问题。
所以就尽量用:Image.LANCZOS