Gimp Python插件Gimp.Image作为numpy数组

Gimp Python插件Gimp.Image作为numpy数组,python,numpy,plugins,gimp,gimpfu,Python,Numpy,Plugins,Gimp,Gimpfu,我正在为GIMP开发一个python插件,我想获得一个层的RGB矩阵作为numpy数组。要访问python插件中的层,我使用以下代码: def python_function(img, layer): layer = img.layers[0] 我想将layer设置为变量,而不是gimp.Image变量,它是一个numpy数组,包含每个像素的RGB值。我在其他非imp python代码中使用的是下一行:frame2=misc.imread('C:\Users\User\Desktop\

我正在为GIMP开发一个python插件,我想获得一个层的RGB矩阵作为numpy数组。要访问python插件中的层,我使用以下代码:

def python_function(img, layer):
    layer = img.layers[0]
我想将
layer
设置为变量,而不是gimp.Image变量,它是一个numpy数组,包含每个像素的RGB值。我在其他非imp python代码中使用的是下一行:
frame2=misc.imread('C:\Users\User\Desktop\image2.png').astype(np.float32)
。如果我打印
frame2
我会得到这样一个矩阵,其中包含每个像素的RGB值:

[[[ 111.  179.  245.]
  [ 111.  179.  245.]
  [ 111.  179.  245.]
  ..., 
  [  95.  162.  233.]
  [  95.  162.  233.]
  [  95.  162.  233.]]

 [[ 111.  179.  245.]
  [ 111.  179.  245.]
  [ 111.  179.  245.]
  ..., 
  [  95.  162.  233.]
  [  95.  162.  233.]
  [  95.  162.  233.]]

 [[ 111.  179.  245.]
  [ 111.  179.  245.]
  [ 111.  179.  245.]
  ..., 
  [  95.  162.  233.]
  [  95.  162.  233.]
  [  95.  162.  233.]]
  ..., 
  [ 113.  127.  123.]
  [ 113.  127.  123.]
  [ 113.  127.  123.]]

 [[  98.  112.  108.]
  [  98.  112.  108.]
  [  98.  112.  108.]
  ..., 
  [ 113.  127.  123.]
  [ 113.  127.  123.]
  [ 113.  127.  123.]]]
是否有任何方法可以将gimp.Image类型变量转换为numpy数组,而无需将其保存在文件中并使用Scipy重新加载

谢谢。

你也可以看看“像素区域”。这些都(很少)被描述。基本上,给定一层:

您可以获得覆盖该层的区域,如下所示:

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字节的字符串(带alpha通道的为16个)
'\xff\x00\x00\xff\x00\x00\xff\x00\x00\xff\x00\x00'
。这在另一个方向起作用,您可以指定给一个区域:

region[0:2,0:2]='\xff'*12 # set to white
直接层阵列函数 我在当前实验中使用的一对函数:

# 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()

谢谢我已经找到了解决办法,但忘了回答我自己的问题。不管怎么说,你的答案确实是有据可查的。将它标记为面对相同问题的任何人的好答案。非常感谢。忘了提到我使用了你用来解决我的问题的那些函数。对于任何正在寻找解决方案的人,请查看上面的答案!经过一些研究,您是否改进了代码(参见编辑的答案)