GdkPixbuf可以处理不同的图片,但对处理某一颜色为透明色好像有点不方便,幸亏已经有些牛人已经将他们的成果分享给了我们。
文章出处: http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli at hotmail dot com>
void gdk_pixbuf_transparent (GdkPixbuf *pixbuf, guint32 pixel)
{
guchar *pixels;
guint r, g, b, a;
guchar *p;
guint w, h;
g_return_if_fail (GDK_IS_PIXBUF (pixbuf));
h = gdk_pixbuf_get_height(pixbuf);
w = gdk_pixbuf_get_width(pixbuf);
if(h == 0 || w == 0)
return;
pixels = gdk_pixbuf_get_pixels(pixbuf);
r = (pixel & 0xff000000) >> 24;
g = (pixel & 0x00ff0000) >> 16;
b = (pixel & 0x0000ff00) >> 8;
a = (pixel & 0x000000ff);
while (h--)
{
p = pixels;
w = gdk_pixbuf_get_width(pixbuf);
switch(gdk_pixbuf_get_n_channels(pixbuf))// (pixbuf->n_channels)
{
case 4:
while (w--)
{
if(p[0] == r && p[1] == g && p[2] == b)
{
p[3] = 0;
}
p += 4;
}
break;
default:
break;
}
pixels +=gdk_pixbuf_get_rowstride (pixbuf);
}
return;
}
这样,如要将绿色置为透明色,只需调用gdk_pixbuf_transparent(pixbudDes,0x00FF000000);即可,当然前提是导入的pixbudDes含有alpha通道。如果没有,可先用gdk_pixbuf_add_alpha()加入。
文章出处: http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli at hotmail dot com>
void gdk_pixbuf_transparent (GdkPixbuf *pixbuf, guint32 pixel)
{
guchar *pixels;
guint r, g, b, a;
guchar *p;
guint w, h;
g_return_if_fail (GDK_IS_PIXBUF (pixbuf));
h = gdk_pixbuf_get_height(pixbuf);
w = gdk_pixbuf_get_width(pixbuf);
if(h == 0 || w == 0)
return;
pixels = gdk_pixbuf_get_pixels(pixbuf);
r = (pixel & 0xff000000) >> 24;
g = (pixel & 0x00ff0000) >> 16;
b = (pixel & 0x0000ff00) >> 8;
a = (pixel & 0x000000ff);
while (h--)
{
p = pixels;
w = gdk_pixbuf_get_width(pixbuf);
switch(gdk_pixbuf_get_n_channels(pixbuf))// (pixbuf->n_channels)
{
case 4:
while (w--)
{
if(p[0] == r && p[1] == g && p[2] == b)
{
p[3] = 0;
}
p += 4;
}
break;
default:
break;
}
pixels +=gdk_pixbuf_get_rowstride (pixbuf);
}
return;
}
这样,如要将绿色置为透明色,只需调用gdk_pixbuf_transparent(pixbudDes,0x00FF000000);即可,当然前提是导入的pixbudDes含有alpha通道。如果没有,可先用gdk_pixbuf_add_alpha()加入。