我有以下Python代码。问题是内存使用量大幅增长。
鉴于Image.rotate()
返回一个新对象,我原以为旧对象不能再引用它并被删除。
会发生什么,我该如何解决这个问题?
from PIL import Image
src_im = Image.open("input.png")
steps = 120 # Works with 3
angle = 360.0 / steps
rotation = src_im.convert('RGBA')
for _ in xrange(steps):
rotation = rotation.rotate(angle, expand = 1)
rotation = rotation.crop(rotation.getbbox()).resize(src_im.size)
rotation.save("out.png")
这是在Python 2.7.3中。 Python 3的特定解决方案是可以接受的。
答案 0 :(得分:3)
问题不是内存泄漏,而是expand
参数。从枕头文件(强调我的):
expand - 可选扩展标志。如果为true,会扩展输出图像,使其足以容纳整个旋转图像。
您可以在循环中添加print(rotation.size)
大小以查看此内容。输出:
(852, 646)
(885, 690)
(921, 736)
(959, 784)
(1000, 834)
(1043, 886)
(1089, 940)
(1138, 996)
(1190, 1055)
(1245, 1116)
(1303, 1180)
(1364, 1247)
(1429, 1317)
(1497, 1390)
(1568, 1467)
(1643, 1548)
(1723, 1632)
(1807, 1720)
(1896, 1813)
(1989, 1910)
(2087, 2012)
(2191, 2119)
(2299, 2231)
...
要在不剪切边框的情况下旋转图像,请使用expand = 1
,然后立即裁剪到图像的非alpha区域:
for _ in xrange(steps):
rotation = rotation.rotate(angle, expand = 1)
rotation = rotation.crop(rotation.getbbox())