将图像旋转 90° 时,如何阻止 PIL 交换 height/width?
How do I stop PIL from swapping height/width when rotating an image 90°?
我正在使用 PIL 旋转图像。这通常有效,除非我将图像恰好旋转 90° 或 270°,在这种情况下 x 和 y 测量值交换。也就是说,给定这张图片:
>>> img.size
(93, 64)
如果我将它旋转 89°,我会得到:
>>> img.rotate(89).size
(93, 64)
然后 91° 我明白了:
>>> img.rotate(91).size
(93, 64)
但是如果我将它旋转 90° 或 270°,我会找到高度和宽度
交换:
>>> img.rotate(90).size
(64, 93)
>>> img.rotate(270).size
(64, 93)
防止这种情况的正确方法是什么?
我希望有人能想出一个更优雅的解决方案,但这似乎目前有效:
img = Image.open('myimage.pbm')
frames = []
for angle in range(0, 365, 5):
# rotate the image with expand=True, which makes the canvas
# large enough to contain the entire rotated image.
x = img.rotate(angle, expand=True)
# crop the rotated image to the size of the original image
x = x.crop(box=(x.size[0]/2 - img.size[0]/2,
x.size[1]/2 - img.size[1]/2,
x.size[0]/2 + img.size[0]/2,
x.size[1]/2 + img.size[1]/2))
# do stuff with the rotated image here.
对于 90° 和 270° 以外的角度,这会导致相同的行为
如果你设置 expand=False
并且不理会 crop
操作。
我正在使用 PIL 旋转图像。这通常有效,除非我将图像恰好旋转 90° 或 270°,在这种情况下 x 和 y 测量值交换。也就是说,给定这张图片:
>>> img.size
(93, 64)
如果我将它旋转 89°,我会得到:
>>> img.rotate(89).size
(93, 64)
然后 91° 我明白了:
>>> img.rotate(91).size
(93, 64)
但是如果我将它旋转 90° 或 270°,我会找到高度和宽度 交换:
>>> img.rotate(90).size
(64, 93)
>>> img.rotate(270).size
(64, 93)
防止这种情况的正确方法是什么?
我希望有人能想出一个更优雅的解决方案,但这似乎目前有效:
img = Image.open('myimage.pbm')
frames = []
for angle in range(0, 365, 5):
# rotate the image with expand=True, which makes the canvas
# large enough to contain the entire rotated image.
x = img.rotate(angle, expand=True)
# crop the rotated image to the size of the original image
x = x.crop(box=(x.size[0]/2 - img.size[0]/2,
x.size[1]/2 - img.size[1]/2,
x.size[0]/2 + img.size[0]/2,
x.size[1]/2 + img.size[1]/2))
# do stuff with the rotated image here.
对于 90° 和 270° 以外的角度,这会导致相同的行为
如果你设置 expand=False
并且不理会 crop
操作。