【问题标题】:Reading alpha from each pixel in Blender从 Blender 中的每个像素读取 alpha
【发布时间】:2014-11-26 20:14:21
【问题描述】:

我似乎在从 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 已加载到搅拌机的缓存中,并且它只是一个常规的 RGBA png 图像,其中包含可见和不可见部分,所以从逻辑上讲,我的打印输出应该包含一些变化,而不仅仅是 1.0, 1.0, 1.0 and 0.0不断为每个像素...?

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

【问题讨论】:

    标签: python alpha blender rgba bpy


    【解决方案1】:

    您的代码运行良好(使用 blender 2.71 测试)。

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

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

    【讨论】:

    • Random Citizen,非常感谢您的回复,我的问题是您列出的情况 2 :) 我想我确信我的 png 是透明的,但它不包含任何透明度数据,它只是黑白的。我还从你那里学到了一些更重要的东西,那就是 Blender 从左下角到右上角计算像素,如果我还没有读过,那可能是我的下一个问题,我会打碎我的头再说一遍:) 现在我很清楚为什么我的结果如此不可预测......
    猜你喜欢
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 2013-05-30
    • 2011-02-24
    • 1970-01-01
    • 2012-05-07
    相关资源
    最近更新 更多