PIL Image.save()函数在Blender python中失败

时间:2014-01-20 12:19:48

标签: python python-imaging-library blender

我正在为Blender 2.69开发一个插件。我在插件中使用PIL库的Image模块。

根据我在互联网上找到的说明,我首先为Python33安装了PIL,然后将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。它失败了(在Blender中)所有其他格式 - TIFF,PGM,JPEG等

我做了一些挖掘,最近在Pillow github回购报告了几个问题:(1) (2)

更令人感兴趣的是来自2009年的this forum post,它报告了Maya的python解释器中完全相同的行为。

当发生这种情况时,我在Blender中没有堆栈跟踪,因为Blender只是崩溃了。我敢打赌它与Maya python帖子中的错误相同。

可能导致此问题的原因是什么?除了使用其他图像转换方法之外还有什么解决方案吗?

1 个答案:

答案 0 :(得分:4)

我仍然没有找到此问题的确切原因,但我确实设法找到了解决方法。

不是使用img.save()直接写入文件,而是写入缓冲区。然后将缓冲区写入文件。这有效并且不会使Blender崩溃。

所以,而不是写这个:

img.save(outputFileName)

写下这个:

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

对于支持的格式,请检查this link