2013-06-04 104 views
0

因此,我需要拍摄一张我在PIL中制作的图像,并将其转换为可在绘图中显示的像素图。将PIL图像转换为带有alpha的GTK像素图

如何从PIL转换为pixmap并保持图像alpha?

目前,我有这个代码写的:

def gfx_draw_tem2(self, r, x, y): 
    #im = Image.open("TEM/TEM cropped.png") 
    im = Image.new("RGBA", (r*2,r*2), (255, 255, 255, 255)) 
    draw = ImageDraw.Draw(im) 

    for i in range(0,r*2): 
     for j in range(0,r*2): 
      if(self.in_circle(i,j,r)): 
       draw.point((i,j), fill=(100,50,75,50)) #alpha at 255 for test2.png 

    im.save("test.png") 

    im_data = im.tostring() 
    pixbuf = gdk.pixbuf_new_from_data(im_data, gdk.COLORSPACE_RGB, True, 8, im.size[0], im.size[1], 4*im.size[0]) 
    pixmap2, mask = pixbuf.render_pixmap_and_mask() 

    self.pixmap.draw_drawable(self.white_gc, pixmap2, 0,0,x-r,y-r,-1,-1) 

下面是我从im.save创建的映像( “test.png”):

http://imgur.com/43spsBG,lqowten#0

通知的第一张照片有一个阿尔法255(全)和秒有一个阿尔法50.

但是,当我将图像转换为与我当前的代码的pixmap我失去了透明af FECT。

感谢您的帮助,

伊恩

编辑:我有更多的测试范围缩小一点点。将pixbuf转换为像素图时,我失去了图像的alpha值。

回答

1

好吧想通了。这里

诀窍是不是pixbuf的转换为使用像素图pixbuf.render_pixmap_and_mask()

相反,我把我的self.pixmap我画到我的绘制,并呼吁draw_pixbuf()就可以了。

这是我使用的新代码。

def gfx_draw_tem2(self, r, x, y): 
    im = Image.new("RGBA", (r*2,r*2), (1, 1, 1, 0)) 
    draw = ImageDraw.Draw(im) 

    for i in range(0,r*2): 
     for j in range(0,r*2): 
      if(self.in_circle(i,j,r)): 
       draw.point((i,j), fill=(100,50,75,140)) 

    im_data = im.tostring() 
    pixbuf = gdk.pixbuf_new_from_data(im_data, gdk.COLORSPACE_RGB, True, 8, im.size[0], im.size[1], 4*im.size[0]) 
    self.pixmap.draw_pixbuf(self.white_gc, pixbuf, 0, 0, x, y, -1, -1, gdk.RGB_DITHER_NORMAL, 0, 0) 

希望这可以帮助别人。