我正在尝试做我认为微不足道的事情,但无论我尝试什么,ClutterImage
我都会收到错误消息Unable to load image data
。我使用的语言是 Vala,所以 Clutter 的 Vapi 文件有可能是错误的。对GdkPixbuf
我来说似乎很好,我可以GtkImage
用它设置 a,我可以将它保存到磁盘而不会出错,但是如果我将图像文件读回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看到。
如果它完全相关,我可以包含 Vala 吐出的 C 代码,但它看起来对我来说是正确的。
我开始认为这ClutterImage
不起作用,所以我用我保存的图像文件尝试了https://github.com/GNOME/clutter/blob/master/examples/image-content.cpixbuf.save (...)
中的示例和有用。所以现在我在想可能是我试图将图像对象用作小部件ClutterActor
中的一个GtkClutterEmbed
。那里真的没什么可看的,代码是
var embed = new GtkClutter.Embed ();
viewport.add (embed);
var stage = embed.get_stage ();
image = new Clutter.Image ();
stage.content = image;
在我看来,这与有效示例中的内容相同,因为舞台是 aClutterActor
并且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