我有以下 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 特定的解决方案是可以接受的。
最佳答案
问题不是内存泄漏,而是 expand
参数。来自枕头文档(强调我的):
expand – Optional expansion flag. If true, expands the output image to make it large enough to hold the entire rotated image.
您可以在循环中添加 print(rotation.size)
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())
关于python - 内存增长虽然被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27128055/