Преобразование изображения PIL в растровое изображение GTK с альфа
Поэтому мне нужно взять изображение, которое я сделал в PIL, и преобразовать его в растровое изображение, которое будет отображаться в рисованном виде.
Как я могу преобразовать из PIL в растровое изображение и сохранить изображения альфа?
В настоящее время у меня есть этот код написано:
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
Обратите внимание, что первое изображение имеет альфа 255 (полное), а секундное - 50.
Однако, когда я конвертирую изображения в растровое изображение с моим текущим кодом, я теряю прозрачность.
Спасибо за вашу помощь,
Ян
РЕДАКТИРОВАТЬ: я немного сузил его с большим количеством испытаний. Я теряю альфа моего изображения при преобразовании pixbuf в растровое изображение.
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)
Надеюсь, это кому-нибудь поможет.