2014-01-20 32 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