【问题标题】:Memory Growth Though Overwritten内存增长虽然被覆盖
【发布时间】:2015-01-23 12:51:28
【问题描述】:

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

【问题讨论】:

  • 有趣。我刚刚尝试过:gc.collect 和显式 del,但没有任何帮助。

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


【解决方案1】:

问题不是内存泄漏,而是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())

【讨论】:

  • 优秀的答案!已接受,我将在解决方案中进行编辑以不切断边缘进行旋转。
猜你喜欢
  • 1970-01-01
  • 2018-12-25
  • 2023-03-17
  • 1970-01-01
  • 2016-09-18
  • 2021-01-30
  • 2013-04-05
  • 1970-01-01
  • 2014-08-24
相关资源
最近更新 更多