使用PIL库对图片进行等比例压缩,无论压缩前文件大小如何,压缩后文件小于10KB。
时间: 2024-01-27 12:13:03 浏览: 130
可以使用PIL库中的`Image`模块来对图片进行等比例压缩,并且通过不断调整压缩质量来控制输出文件大小。下面是一个示例代码:
```python
from PIL import Image
import io
def compress_image(image_path):
with open(image_path, 'rb') as f:
with Image.open(io.BytesIO(f.read())) as img:
# 设置压缩质量
quality = 60
# 最大压缩质量
max_quality = 10
# 最大文件大小
max_size = 10 * 1024 # 10KB
# 获取原始图片大小
orig_size = img.size
# 先按原始大小压缩一遍
img.thumbnail(orig_size)
# 不断递减压缩质量,直到文件大小小于10KB
while quality > max_quality:
# 将图片转为bytes对象
with io.BytesIO() as output:
img.save(output, format='JPEG', quality=quality)
image_bytes = output.getvalue()
# 如果文件大小小于10KB,返回压缩后的图片
if len(image_bytes) < max_size:
return Image.open(io.BytesIO(image_bytes))
# 否则递减压缩质量
quality -= 5
# 返回压缩后的图片
return img
```
这个函数接受一个图片路径作为参数,并返回一个压缩后的`Image`对象。在函数中,先按原始大小压缩一遍,然后不断递减压缩质量,直到文件大小小于10KB。最后返回压缩后的`Image`对象。
需要注意的是,压缩质量越低,图片失真越明显。因此,需要根据实际情况调整`quality`和`max_quality`参数,以在保证文件大小小于10KB的情况下尽可能减小失真。
阅读全文