Настройка ClutterImage с помощью GdkPixbuf

Я пытаюсь сделать то, что, как мне казалось, будет тривиально, но независимо от того, что я пытаюсь сделать с ClutterImage, я получаю сообщение об ошибке Unable to load image data. Я использую язык Vala, поэтому есть вероятность, что файл Vapi для Clutter неверен. Мне кажется, что GdkPixbuf, который у меня есть, мне подходит, я могу установить с ним GtkImage и сохранить его на диск без ошибок, но если я прочитаю файл изображения обратно в GdkPixbuf -> ClutterImage, я получаю ту же ошибку от Clutter. Я также пробовал каждое значение COGL_PIXEL_FORMAT_*, и оно всегда одно и то же, хотя я уверен, что данные изображения имеют формат RGB24.

Мой код:

private Clutter.Content image;

construct {
    ...
    image = new Clutter.Image ();
    ...
}

public void set_image (Gdk.Pixbuf pixbuf) {
    lock (image) {
        unowned uint8[] pixels = pixbuf.get_pixels_with_length ();
        assert (pixels.length == pixbuf.width * pixbuf.height * 3);
        try {
            image.set_data (pixels,
                            Cogl.PixelFormat.RGB_888;
                            pixbuf.width,
                            pixbuf.height,
                            pixbuf.rowstride);
        } catch (Error e) {
            critical (e.message);
        }
    }
}

который я адаптировал из примера C в документации, которую можно увидеть по адресу https://valadoc.org/clutter-1.0/Clutter.Image.set_data.html.

Если это вообще уместно, я могу включить код C, который выплевывает Вала, но мне он кажется правильным.

Я начал думать, что ClutterImage не работает, поэтому попробовал пример из https://github.com/GNOME/clutter/blob/master/examples/image-content.c с моим файлом изображения, который я сохранил с помощью pixbuf.save (...), и он работает. Итак, теперь я думаю, что, возможно, я пытаюсь использовать объект изображения как ClutterActor в виджете GtkClutterEmbed. Там действительно не на что смотреть, код

var embed = new GtkClutter.Embed ();
viewport.add (embed);
var stage = embed.get_stage ();
image = new Clutter.Image ();
stage.content = image;

что для меня выглядит так же, как в примере, который работает, в том смысле, что сцена - это ClutterActor, а ClutterImage установлено как содержимое актера. Итак... Я немного растерялся.

Простой пример

public static int main (string[] args) {
    GtkClutter.init (ref args);

    var window = new Gtk.Window ();
    var scrolled = new Gtk.ScrolledWindow (null, null);
    var embed = new GtkClutter.Embed ();

    window.add (scrolled);
    scrolled.add_with_viewport (embed);

    var pixbuf = new Gdk.Pixbuf.from_file ("image.png");
    var image = new Clutter.Image ();
    image.set_data (pixbuf.get_pixels (),
                    Cogl.PixelFormat.RGB_888,
                    pixbuf.width,
                    pixbuf.height,
                    pixbuf.rowstride);
    var stage = embed.get_stage ();
    stage.content = image;

    window.destroy.connect (Gtk.main_quit);
    window.show_all ();
    Gtk.main ();

    return 0;
}

Скомпилировано с использованием

valac --pkg cogl-1.0 --pkg clutter-gtk-1.0 --pkg gtk+-3.0 clutter-image-content.vala

person geoffjay    schedule 07.06.2017    source источник
comment
Есть ли у изображения альфа-канал? Если да, то это должен быть RGBA_8888, а не RGB_888. Если это не так, опубликуйте короткий, самостоятельный, правильный пример (‹sscce.org/› ).   -  person nemequ    schedule 07.06.2017
comment
Нет, альфа-канала нет. Данные изображения были получены с камеры, которая предоставляет информацию о пикселях Bayer RG8, которая была преобразована в изображение RGB24. Пример, который я разместил в соответствии с вашим предложением, правильно загружает изображение, которое было преобразовано в Pixbuf и сохранено в файл. Между прочим, репозиторий — github.com/geoffjay/sentech-viewer.   -  person geoffjay    schedule 12.06.2017


Ответы (1)


Я не думаю, что это больше связано с беспорядком, я думаю, что проблема была связана с тем, что мой видеодрайвер не загружался должным образом и не имел графического ускорения. Наконец-то я перезагрузился, и мне пришлось пересобрать модули Nvidia, теперь я не получаю ошибку Unable to load data. Я получаю новый из библиотеки Aravis, но это совершенно не связано с этим. Не уверен, должен ли я просто удалить этот вопрос или нет.

person geoffjay    schedule 12.06.2017