使用Pillow旋转图像时左右边缘不平滑,如何让padding也作用于左右侧?
问题原因
ImageOps.pad的设计逻辑是保持原图宽高比不变,先将原图等比缩放至恰好能放入你指定的目标尺寸内,再对剩余空白区域做填充,并非给四边均匀添加指定宽度的padding。
你使用的原图宽高比为2:1,指定的目标尺寸(w+padding, h+padding)宽高比约为1.96:1,二者不一致。缩放后原图宽度刚好接近目标宽度,左右无多余空间需要填充,仅上下方向有剩余空间,因此只会给上下添加填充。
解决方案
要给四边均匀添加透明填充,使用专门用来添加边框的ImageOps.expand函数即可,修复后的代码如下:
from PIL import Image, ImageOps import numpy as np img = Image.open("sunset200x100.jpg") w, h = img.size padding = 2 # 四边各加2px透明边框,总宽高增量和你之前的设置一致 img = img.convert('RGBA') # 用expand添加透明边框,fill参数设为RGBA格式的全透明值 img = ImageOps.expand(img, border=padding, fill=(0,0,0,0)) rotated_im = img.rotate(56, expand=True, resample=Image.BICUBIC) rotated_im.save("rotated_sunset200x100_padded.png")
如果需要给四个方向设置不同的填充宽度,可以给border参数传入(左, 上, 右, 下)格式的元组,比如border=(3,2,3,2)代表左右各加3px、上下各加2px填充。
修改后旋转时双三次插值会同时采样图像像素和边缘的透明填充像素,四个方向的边缘都会有平滑的过渡效果。
内容的提问来源于stack exchange,提问作者OneWorld
相关产品推荐
相关产品推荐

