Как конвертировать SDL_Surface в GtkImage - PullRequest
1 голос
/ 22 мая 2019

Я делаю школьный проект, и я уже внес огромный вклад в обработку изображений с помощью SDL, сейчас я создаю графический интерфейс с Glade, и мне нужно преобразовать SDL_Surface в GtkImage, чтобы отображать каждый шаг моей обработки награфический интерфейсКак я могу это сделать?

Я попытался преобразовать 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 ]

1 голос
/ 22 мая 2019

Вы не можете напрямую использовать необработанные данные пикселей, если они не в правильном формате.

Код ниже заботится о преобразовании данных пикселей в правильный формат. Работает с любой поверхностью 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;
}
0 голосов
/ 22 мая 2019

gdk_pixbuf_new_from_data () должно работать для 8-битного RGB - вам просто нужно найти детали формата пикселя SDL, чтобы заполнить аргументы функции. Обратите внимание, что Pixbuf не будет делать копию: он будет продолжать использовать данные пикселей, которые вы передаете (поэтому сделайте копию самостоятельно или убедитесь, что SDL_Surface не освободит данные преждевременно).

...