我正在做一个学校项目,我已经在使用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
答案 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不会过早释放数据)。