为什么我的cairo_surface_t绘图是半透明的?

时间:2015-07-16 15:46:27

标签: c++ ubuntu gtk cairo

我正在尝试使用C ++ Cairo和Gtk在Ubuntu上绘制一个png图像,其内容以ARGB32格式存储在内存中。

首先,我创建一个GtkDrawingArea,然后在它的expose-event上绘制一个蓝色的背景,从左上角到右下角有一条红线,然后我创建一个曲面并尝试将它绘制到绘图区域。这是我的揭露事件回调:

unsigned char *pCairoBuf = ...

....

gboolean OnDrawingAreaExposeEvent(GtkWidget *pWidget, GdkEventExpose *pEvent, gpointer data)
{
    cairo_t *cr = gdk_cairo_create(pWidget->window);

    cairo_set_source_rgb(cr, 0.0, 0.0, 1.0);
    cairo_rectangle(cr, 0.0, 0.0, pEvent->area.width, pEvent->area.height);
    cairo_fill(cr);

    cairo_set_source_rgb(cr, 1.0, 0.0, 0.0);
    cairo_set_line_width(cr, 10.0);
    cairo_move_to(cr, 0.0, 0.0);
    cairo_line_to(cr, pEvent->area.width, pEvent->area.height);
    cairo_stroke(cr);

    // Use the existing buffer pCairoBuf that has (iRenderWidth * iRenderHeight * 4) bytes, 4 bytes per pixel for ARGB32 and zero row padding   
    cairo_surface_t *pSurface = cairo_image_surface_create_for_data(pCairoBuf, CAIRO_FORMAT_ARGB32, iRenderWidth, iRenderHeight, (iRenderWidth * 4));

    cairo_set_source_surface(cr, pSurface, 0.0, 0.0);
    cairo_paint(cr);

    cairo_destroy(cr);

    return TRUE;
}

绘图区域和图像均为244x278像素。图像是Smokey the Bear头部的图像,头部透明:

enter image description here

我希望最终结果如下:

enter image description here

但最终看起来像这样:

enter image description here

我没有添加显示我如何获得数据缓冲区pCairoBuf的代码,因为我认为它只会使问题浮现,但也许我错了?我认为还有其他一些事我做错了与cairo表面等有关,这可以解释我期待的和我得到的之间的区别。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

作为猜测,没有使用任何这些库,我说你的alpha通道在你的图像中是统一的,并且渲染也将这个应用到你的图像部分#&# 39; d喜欢不透明。尝试仅将alpha通道应用于您希望透明的像素。

答案 1 :(得分:0)

我明白了。当我在传递给cairo_image_surface_create_for_data()的缓冲区中填写ARGB32数据时,我按顺序填写字节A,R,G,B。作为实验,我颠倒了顺序并填写了字节B,G,R,A,它完美地工作。