AWS Lambda中Pillow图片缩放逻辑错误:生成同尺寸图片求助
问题解决:Pillow缩放图片尺寸无效的原因与修复方案
我一眼就看出问题所在啦——你在使用Pillow的resize()方法时犯了一个非常常见的小疏忽!
问题根源
Pillow的Image.resize()方法不会直接修改原图像对象,它会返回一个调整尺寸后的新图像实例。你当前的代码里只是调用了image.resize(dim),但没有将这个返回的新图像赋值给变量,最后保存的依然是原始尺寸的图片,这就导致两张输出图的尺寸完全一致,和你预期的两种尺寸不符。
修复后的代码
只需要修改两个缩放函数,把resize()返回的新图像赋值给变量后再保存即可:
from __future__ import print_function import boto3 import os import sys import uuid from PIL import Image import PIL.Image s3_client = boto3.client('s3') def resize_image_DOG(image_path, resized_path): with Image.open(image_path) as image: dim=(3840,2160) # 接收resize返回的新图像实例 resized_image = image.resize(dim) resized_image.save(resized_path) def resize_image_CAT(image_path, resized_path): with Image.open(image_path) as image: dim=(1920,1080) resized_image = image.resize(dim) resized_image.save(resized_path) def handler(event, context): for record in event['Records']: bucket = record['s3']['bucket']['name'] key = record['s3']['object']['key'] download_path = '/tmp/{}{}'.format(uuid.uuid4(), key) upload_path_1 = '/tmp/resized-{}{}'.format('test1',key) upload_path_2 = '/tmp/resized-{}{}'.format('test2',key) s3_client.download_file(bucket, key, download_path) resize_image_DOG(download_path, upload_path_1) resize_image_CAT(download_path, upload_path_2) s3_client.upload_file(upload_path_1, '{}resized'.format(bucket), key+'xxxhdpi-3840*2160'+'.png') s3_client.upload_file(upload_path_2, '{}resized'.format(bucket), key+'xxxhdpi-1920*1080'+'.png')
额外优化提示
如果需要提升缩放后图片的质量,可以给resize()方法加上重采样参数(推荐使用LANCZOS算法,适合缩小或放大图像时保持清晰度):
- 对于Pillow 9.1.0及以上版本:
resized_image = image.resize(dim, resample=Image.Resampling.LANCZOS) - 对于旧版本Pillow:
resized_image = image.resize(dim, resample=Image.LANCZOS)
这样修改后,你上传到S3的两张图片就会分别是3840×2160和1920×1080的尺寸啦!
内容的提问来源于stack exchange,提问作者Nishant Singh
相关产品推荐
相关产品推荐

