我似乎在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
通道,而是通过将每个颜色通道与阿尔法通道r*a, g*a, b*a, a
相乘来存储图像