【问题标题】:Setting a ClutterImage using a GdkPixbuf使用 GdkPixbuf 设置 ClutterImage
【发布时间】:2017-06-07 01:14:33
【问题描述】:

我正在尝试做我认为微不足道的事情,但无论我尝试使用ClutterImage 做什么,我都会收到错误消息Unable to load image data。我使用的语言是 Vala,所以 Clutter 的 Vapi 文件有可能是错误的。我拥有的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);
        }
    }
}

我从 https://valadoc.org/clutter-1.0/Clutter.Image.set_data.html 可以看到的文档中的 C 示例中的内容改编而来。

如果它完全相关,我可以包含 Vala 吐出的 C 代码,但它看起来对我来说是正确的。

我开始认为ClutterImage 不起作用,所以我尝试了https://github.com/GNOME/clutter/blob/master/examples/image-content.c 中的示例以及我使用pixbuf.save (...) 保存的图像文件,它可以工作。所以现在我在想,我可能正在尝试将图像对象用作GtkClutterEmbed 小部件中的ClutterActor。那里真的没什么可看的,代码是

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

在我看来,这与有效示例中的相同,因为舞台是ClutterActorClutterImage 被设置为演员内容。所以……我现在有点茫然了。

简单示例

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

【问题讨论】:

  • 图片有alpha通道吗?如果是这样,它需要是 RGBA_8888 而不是 RGB_888。如果不是这样,请发布一个简短、独立、正确的示例 (sscce.org/>)。
  • 不,没有 Alpha 通道。图像数据来自提供 Bayer RG8 像素信息的相机,该信息被转换为 RGB24 图像。我根据您的建议发布的示例正确加载了转换为 Pixbuf 并保存到文件的图像。 FWIW repo 是 github.com/geoffjay/sentech-viewer。

标签: vala gdk clutter gdkpixbuf clutter-gui


【解决方案1】:

我认为这不再与 Clutter 有关,我认为该问题与我的视频驱动程序未正确加载并且没有图形加速有关。我终于开始重新启动并不得不重建 Nvidia 模块,现在我没有收到 Unable to load data 错误。我从 Aravis 图书馆得到了一个新的,但这与此完全无关。不知道我是否应该删除这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2011-02-14
    • 1970-01-01
    • 2012-05-07
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多