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

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

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头部的图像,在其头部周围是透明的:

我希望最终结果看起来像这样:

但是最终看起来像这样:

我没有添加显示如何获取数据缓冲区pCairoBuf的代码,因为我认为它只会使问题蒙上阴影,但也许我错了?我发现与cairo曲面等有关,还有其他地方我做错了,这可以解释我期望和得到的东西之间的区别。

在此先感谢您的帮助!

最佳答案

可以猜测,没有使用任何这些库,我想说的是您的alpha通道在整个图像上是统一的,并且渲染也将其应用到您想要非透明的图像部分。尝试仅将Alpha通道应用于希望透明的像素。

07-26 02:01