2014-01-20 31 views
2

我正在開發一個用於Blender 2.69的插件。我正在使用插件中的PIL庫的Image模塊。PIL Image.save()函數在Blender中失敗python

根據我在互聯網上找到的說明,我首先安裝了PIL for Python33,然後將該站點包的Python文件夾複製到Blender的相同文件夾中。

像Image.open()這樣的函數可以像讀取Exif數據的函數一樣工作。

但是,以下語句失敗,並且Blender崩潰。

img.save(outputFileName) 

save()方法位於PIL的Image.py模塊中。以下是相關部分:

try: 
    import builtins 
except ImportError: 
    import __builtin__ 
    builtins = __builtin__ 
... 
... 
def save(self, fp, format=None, **params): 
    ... 
    try: 
     # Following statement fails, and Blender crashes. 
     save_handler(self, fp, filename) 
    finally: 
     if close: 
      fp.close() 

這個語句在使用Python 3.3解釋器(而不是Blender解釋器)執行時有效。只有在圖像格式爲PNG時,此聲明才適用於Blender。它失敗(在攪拌機)的所有其他格式 - TIFF,PGM,JPEG等

我做了一些挖掘,和一對夫婦的問題進行了報道枕頭上github上回購近期:(1)(2)

更耐人尋味的是2009年的this forum post,它在Maya的python解釋器中報告完全相同的行爲。

當發生這種情況時,我在Blender中沒有得到堆棧跟蹤,因爲Blender只是崩潰。我敢打賭,它和Maya python文章中的錯誤一樣。

什麼可能導致此問題?除了使用其他圖像轉換方法之外,還有其他解決方案嗎?

+0

考慮附加一個(可能是遠程)調試器來獲取堆棧蹤跡 – goncalopp

+0

[This addon](http://goodspiritgraphics.com/software/products/breakpoint-addon/)可能有助於調試。 [這個問題](http://blender.stackexchange.com/questions/6339/python-commands-from-terminal-arent-working-ubuntu-13-10)有一些提示和其他鏈接,也可能有助於調試。在gdb(或類似的)中啓動攪拌器以在碰撞時捕捉它以查看回溯。 – sambler

+0

@cgohlke:這解釋了很多。任何解決方案是否還有其他影像庫可以與Blender的python一起使用? – ApoorvaJ

回答

2

我還沒有找到這個問題的確切原因,但我設法找到了解決方法。

不是直接使用img.save()寫入文件,而是寫入緩衝區。然後將緩衝區寫入文件。這工作,並不會崩潰攪拌機。

因此,而不是寫這個:

img.save(outputFileName) 

這樣寫:

buffer = BytesIO() 
img.save(buffer, format = "jpeg") 
open(outputFileName, "wb").write(buffer.getvalue()) 

對於支持的格式,檢查this link