为何使用PIL旋转图片后,获取的宽高结果始终相同?
图片旋转后宽度和高度不变的原因是什么?
即使图片已被旋转,我获取到的宽度和高度仍保持相同,请问这一现象的原因是什么?
测试代码
from PIL import Image with Image.open("pic.jpg") as im: rotated_90 = im.rotate(90) print(rotated_90.size, "\t", rotated_90.width, rotated_90.height) rotated_180 = im.rotate(180) print(rotated_180.size, "\t", rotated_180.width, rotated_180.height) rotated_270 = im.rotate(270) print(rotated_270.size, "\t", rotated_270.width, rotated_270.height)
输出结果
(1049, 590) 1049 590 (1049, 590) 1049 590 (1049, 590) 1049 590
原因分析
这是因为PIL的rotate()方法默认不会调整画布尺寸:
- 调用
rotate()时,它只是在原图像的画布范围内旋转图像内容,旋转后超出原画布的部分会被裁剪,空白区域会用默认背景色(通常是黑色)填充,所以图像的size(宽高)和原图像保持一致。 - 如果你想让旋转后的图像自动适配新的宽高(比如90/270度旋转后交换宽高),只需要给
rotate()加上expand=True参数,此时PIL会自动计算能完整容纳旋转后图像的画布尺寸,宽高就会相应变化。
修改后的示例代码
from PIL import Image with Image.open("pic.jpg") as im: # 添加expand=True参数,自动适配旋转后的画布尺寸 rotated_90 = im.rotate(90, expand=True) print(rotated_90.size, "\t", rotated_90.width, rotated_90.height) rotated_180 = im.rotate(180, expand=True) print(rotated_180.size, "\t", rotated_180.width, rotated_180.height) rotated_270 = im.rotate(270, expand=True) print(rotated_270.size, "\t", rotated_270.width, rotated_270.height)
此时90/270度旋转后的输出会变成(590, 1049),180度旋转因为不改变宽高比例,输出仍为原尺寸。
内容的提问来源于stack exchange,提问作者duruburak
相关产品推荐
相关产品推荐

