使用Pynodes创建自定义Blender组合节点,迭代像素 - 是否可能?

时间:2016-02-23 17:17:25

标签: python 3d blender

我想为Blender创建一个组合节点,它接收e。 G。 RenderLayers节点的输出并迭代其像素(如果我正确,其输出是每个像素的颜色值)并计算它们的平均颜色值。可能吗?更具体地说,某个位置的输出颜色值是否可以访问其自身的任何其他位置的输入颜色值?

1 个答案:

答案 0 :(得分:0)

Pynodes旨在允许开发人员编写整个自定义节点树,这并不意味着允许将一个自定义节点添加到现有材料或合成节点树中。众所周知,自动更新存在问题,这可能已经改变,因为我没有looked for a while但是sverchok和动画节点仍然会自己处理更新。

通常,节点被设计为处理当前像素的一个结果的小项目。虽然一些内置节点可以查看周围的像素,但我不希望它能从pynodes中获得。

我建议一个只访问完整图像而不是自定义pynode的脚本。这可以合并到一个操作员中,该操作员可以在UV /图像编辑器中的当前图像上使用。

Blender的Image类包含一个pixels property,可以访问原始图像数据。

import bpy

src_image = bpy.data.images['src']
w, h = src_image.size[0], src_image.size[1]

sum_r = 0
sum_g = 0
sum_b = 0
sum_a = 0

for x in range(w):
    for y in range(h):
        idx = ((y * w) + x) * src_image.channels
        sum_r += src_image.pixels[idx]
        sum_g += src_image.pixels[idx+1]
        sum_b += src_image.pixels[idx+2]
        sum_a += src_image.pixels[idx+3]

pix_count = len(src_image.pixels) / src_image.channels
avg_r = sum_r / pix_count
avg_g = sum_g / pix_count
avg_b = sum_b / pix_count
avg_a = sum_a / pix_count

print('red:{} green:{} blue:{} alpha:{}'.format(avg_r,avg_g,avg_b,avg_a))