内存增长虽然被覆盖

时间:2014-11-25 13:28:05

标签: python memory garbage-collection python-imaging-library

我有以下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的特定解决方案是可以接受的。

1 个答案:

答案 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())