2014-09-30 53 views
0

我想用python脚本编辑大量图像。图像数量变化很大,只有少量的图像(10-20)时,一切正常,我没有得到任何错误。当图像数量增加(100-200)时,会发生奇怪的事情。当我直接运行脚本时,我从来没有得到任何错误,一切都运行良好。当我从另一个脚本调用脚本时,会发生MemoryError。
一般过程:
- 文件名检查
- 匹配的.txt文件读取和变量设置
- 图像
上绘制矩形 - 保存图像图像处理内存错误

脚本:

import Image,ImageDraw, os, time, sys 
def main() : 
    print('*****************************************') 
    print('  Draw_Rectangle v1.2     ') 
    print('*****************************************') 
    print(' ') 
    start= time.time() 
    print(' ') 
    print('Starting drawing rectangles...') 
    path = os.path.join("C:\Program Files\test\images") 
    fileList = os.listdir(path) 
    total = len(fileList) 
    count = 0 
    for fileName in fileList : 
     if fileName.endswith("FULL.png") : 
      ins = open(os.path.join(path,fileName[:-9]+".txt"), "r") 
      for line in ins : 
       if line[0] == "x" : 
        x = line[2:] 
       if line[0] == "y" : 
        y = line[2:] 
       if line[0] == "w" : 
        w = line[2:] 
       if line[0] == "h" : 
        h = line[2:] 
        break 
      ins.close() 
      im = Image.open(os.path.join(path,fileName)) 
      draw=ImageDraw.Draw(im) 
      draw.rectangle([int(x),int(y),int(x) + int(w),int (y) + int(h)],outline="#0000FF") 
      draw.rectangle([int(x)-1,int(y)-1,int(x) + int(w)-1,int (y) + int(h)-1],outline="#0000FF") 
      draw.rectangle([int(x)+1,int(y)+1,int(x) + int(w)+1,int (y) + int(h)+1],outline="#0000FF") 
      im.save(os.path.join(path,fileName),"PNG") 
      count+=4 
      percentage = (count * 100)/total 
      print 'Progress : [%d%%]\r'%percentage, 
    duration= time.time()-start 
    print('Progress : [100%]') 
    print(' ') 
    print('Drawing rectangles completed') 
    print(' ') 
    print('Duration : ' + str(duration) + ' seconds') 
    return 0 

if __name__ == "__main__": 
    main() 

线代码从另一个脚本调用脚本:

os.system(r'python.exe -u "C:\Scripts\Draw_Rectv2.py"') 

所以总结: 我试图在图像上绘制矩形,当我正常运行脚本时,我没有得到任何错误。当我从其他脚本调用它,我得到

ExceptionInOtherThread(Exception in other Thread - MemoryError) 

亲切的问候, 价格

+0

您可以执行'execfile(r“c:\ Scripts \ Draw_Rectv2.py”)''而不是使用'os.system'。我不知道它是否会修复它,但我认为值得尝试 – Elisha 2014-09-30 12:09:44

+1

使用'system'来获得一个Python脚本来执行另一个脚本是非常不寻常的。你尝试过'进口'而不是? – Kevin 2014-09-30 12:22:08

+0

@Kevin:我使用'system'是因为我在一个不能使用导入的受限制环境中工作。 – 2014-10-06 06:42:11

回答

0

奇。 PIL docs没有提到你需要调用图像的任何close/destroy/dispose方法。我也没有看到你的代码中有任何其他内存泄漏。最后一个可能的问题是其中一个图像非常大或包含Zip Bomb

要确定问题是否出现在其中一个图像中,请在处理它们时记录图像名称(使用完整路径)。这样,您可以查看代码尝试处理的最后一幅图像。