你必须看看“像素区域”。这些(很少)描述here https://www.gimp.org/docs/python/index.html。基本上,给定一个层:
您可以获得覆盖该图层的区域,如下所示:
region=layer.get_pixel_rgn(0, 0, layer.width,layer.height)
您可以通过索引访问像素:
pixel=region[x,y]
这将返回 1/3/4 字节的字符串(请参阅region.bpp
),因此例如白色像素返回为'\xff\xff\xff
' 和一个红色的'\xff\x00\x00'
(假设没有 Alpha 通道:3bpp)。
您还可以访问带有切片的区域,因此左上角的 4 个像素是:
cornerNW=region[0:2,0:2]
这将返回 12 个字节的字符串(16 个字节带有 alpha 通道)'\xff\x00\x00\xff\x00\x00\xff\x00\x00\xff\x00\x00'
。这在另一个方向上起作用,您可以分配给一个区域:
region[0:2,0:2]='\xff'*12 # set to white
直接层np数组函数
我在当前实验中使用的一对函数:
# Returns NP array (N,bpp) (single vector ot triplets)
def channelData(layer):
region=layer.get_pixel_rgn(0, 0, layer.width,layer.height)
pixChars=region[:,:] # Take whole layer
bpp=region.bpp
return np.frombuffer(pixChars,dtype=np.uint8).reshape(len(pixChars)/bpp,bpp)
def createResultLayer(image,name,result):
rlBytes=np.uint8(result).tobytes();
rl=gimp.Layer(image,name,image.width,image.height,image.active_layer.type,100,NORMAL_MODE)
region=rl.get_pixel_rgn(0, 0, rl.width,rl.height,True)
region[:,:]=rlBytes
image.add_layer(rl,0)
gimp.displays_flush()