我正在为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帖子中的错误相同。
可能导致此问题的原因是什么?除了使用其他图像转换方法之外还有什么解决方案吗?
答案 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。