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

Apo*_*vaJ 2 python blender python-imaging-library

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

根据我在互联网上找到的说明,我首先安装了PIL for Python33,然后将Python的site-packages中的文件夹复制到Blender的同一文件夹中。

Image.open() 等函数可以工作,读取 Exif 数据的函数也可以工作。

但是,以下语句失败,Blender 崩溃。

img.save(outputFileName)
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

当使用 Python 3.3 解释器(而不是 Blender 解释器)执行时,同样的语句也有效。仅当图像格式为 PNG 时,此语句也适用于 Blender。对于所有其他格式(TIFF、PGM、JPEG 等),它会失败(在 Blender 中)。

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

更有趣的是2009 年的这篇论坛帖子,其中报告了 Maya 的 Python 解释器内完全相同的行为。

发生这种情况时,我在 Blender 中找不到堆栈跟踪,因为 Blender 崩溃了。我敢打赌这与 Maya python 帖子中的错误相同。

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

Apo*_*vaJ 5

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

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

所以,不要这样写:

img.save(outputFileName)
Run Code Online (Sandbox Code Playgroud)

写下这个:

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

有关支持的格式,请检查此链接