如何将SDL_Surface转换为GtkImage

时间:2019-05-21 21:16:43

标签: c gtk sdl

我正在做一个学校项目,我已经在使用SDL进行图像处理方面做了大量工作,现在我正在用Glade构建GUI,我需要将我的SDL_Surface转换为GtkImage才能显示我在GUI。我该怎么办?

我尝试将SDL_Surface转换为GdkPixbuf,可以轻松将其转换为GtkImage,但没有用

struct _GdkPixbuf *convertToGdk(SDL_Surface *img)
{
  struct _GdkPixbuf *pb = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, img->w, img->h);
  pb->pixels = img->pixels;

  return pb;
}

然后我调用该函数

gtk_image_set_from_pixbuf(GTK_IMAGE(user),convertToGdk(sdl_image));

它甚至没有编译,我得到了这个错误,我也不明白为什么

main.c: In function ‘convertToGdk’:
main.c:16:5: error: dereferencing pointer to incomplete type ‘struct _GdkPixbuf’
   pb->pixels = img->pixels;
     ^~

我当然包括了gdk-pixbuf / gdk-pixbuf.h

2 个答案:

答案 0 :(得分:1)

除非格式正确,否则不能直接使用原始像素数据。

下面的代码负责将像素数据转换为正确的格式。它适用于任何SDL表面:

GtkWidget * gtk_image_new_from_sdl_surface (SDL_Surface *surface)
{
    Uint32 src_format;
    Uint32 dst_format;

    GdkPixbuf *pixbuf;
    gboolean has_alpha;
    int rowstride;
    guchar *pixels;

    GtkWidget *image;

    // select format                                                            
    src_format = surface->format->format;
    has_alpha = SDL_ISPIXELFORMAT_ALPHA(src_format);
    if (has_alpha) {
        dst_format = SDL_PIXELFORMAT_RGBA32;
    }
    else {
        dst_format = SDL_PIXELFORMAT_RGB24;
    }

    // create pixbuf                                                            
    pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, has_alpha, 8,
                             surface->w, surface->h);
    rowstride = gdk_pixbuf_get_rowstride (pixbuf);
    pixels = gdk_pixbuf_get_pixels (pixbuf);

    // copy pixels                                                              
    SDL_LockSurface(surface);
    SDL_ConvertPixels (surface->w, surface->h, src_format,
               surface->pixels, surface->pitch,
               dst_format, pixels, rowstride);
    SDL_UnlockSurface(surface);

    // create GtkImage from pixbuf                                              
    image = gtk_image_new_from_pixbuf (pixbuf);

    // release our reference to the pixbuf                                      
    g_object_unref (pixbuf);

    return image;
}

答案 1 :(得分:0)

gdk_pixbuf_new_from_data()应该适用于8位RGB -您只需要查找SDL像素格式的详细信息即可填写函数参数。请注意,Pixbuf不会复制:它将继续使用您传递的像素数据(因此,请自己复制或确保SDL_Surface不会过早释放数据)。