python - 从 Blender 中的每个像素读取 Alpha

标签 python alpha blender rgba bpy

我在 Blender(使用 python)中从 PNG 图像读取像素 RGBA 值(特别是 alpha 值)时似乎遇到问题。

我执行以下操作:

for i in range(0, len(bpy.data.images["name_of_my_png"].pixels), 4):
        print(bpy.data.images["name_of_my_png"].pixels[i:i+4]);

但我从来没有真正得到它打印出相同输出的每个像素的任何预期结果 - 1.0, 1.0, 1.0, 0.0 (我假设这些分别是 R、G、B 和 A 的值)。

我非常确定该 png 已加载到 blender 的缓存中,并且它只是一个常规的 RGBA png 图像,其中包含可见和不可见的部分,因此从逻辑上讲,我的打印输出应该包含一些变化,而不仅仅是 1.0, 1.0, 1.0 and 0.0每个像素不断...?

有人可以向我指出我到底做错了什么吗?我如何通过 Blender-python 读取图像的像素数据?也许我使用了完全错误的方法?

最佳答案

您的代码运行完美(使用 Blender 2.71 进行测试)。

有多种可能的解释,为什么输出看起来不像预期的那样:

  • 垂直翻转:Blender 在内部使用 OpenGL。在 OpenGL 中,图像的原点位于图像的左下角(y 轴指向上方),而不是您可能已经习惯的左上角(y 轴指向下方)。
    这样,代码的打印区域就不再是左上角,而是图像的左下角 4x4 角。检查输出是否与图像的左下角匹配。
  • 未保存透明像素:保存图像文件时,许多图像程序不会将颜色存储在透明区域中。您可能想要使用 gimp 创建 4x4 像素大图像,另存为 png 文件,确保选中 Save color values from transparent pixels复选框。
  • 预乘 Alpha(不是您进行观察的原因):使用预乘颜色格式时,某些算法会提高优雅性并提高性能。而不是单独的 r,g,b,a channel ,图像通过将每个颜色 channel 与 Alpha channel 相乘来存储 r*a, g*a, b*a, a .

关于python - 从 Blender 中的每个像素读取 Alpha,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26150677/

相关文章:

Android Button Alpha 在 2.2 及更低版本上看起来很奇怪

python - 在没有 while 循环的情况下每 n 秒执行一次操作?

javascript - 如何将变形目标从 Blender 导出到 Three.js?

python - 如何使用 scapy 创建新层或新协议(protocol)?

python - Scipy.integrate浮点错误

video - 为什么我的 ffmpeg with videotoolbox 中带有 alpha 的 HEVC 质量不好

ios - 删除图像中的 alpha channel

python - 在 Blender 中无线读取数据时运行游戏引擎

python - 如何让 QtGui 窗口在屏幕上显示时处理事件?

python - 列表索引给出错误的值?