J'essaie de faire ce que j'aurais pensé serait trivial, mais peu importe ce que j'essaie avec un ClutterImage
je reçois le message d'erreur Unable to load image data
. La langue que j'utilise est Vala, donc il y a une possibilité que le fichier Vapi pour Clutter soit faux. Le GdkPixbuf
que je ai semble bien pour moi, je peux définir un GtkImage
avec elle, et je peux l'enregistrer sur le disque sans erreur, mais si je relis le fichier image dans le GdkPixbuf
->ClutterImage
je reçois la même erreur de Clutter. J'ai également essayé toutes les valeurs de COGL_PIXEL_FORMAT_*
et c'est toujours pareil, je suis positif cependant que les données d'image sont dans un format RGB24
.Définition d'un ClutterImage à l'aide d'un GdkPixbuf
Mon code est:
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);
}
}
}
que j'ai adapté de ce qui est dans un exemple de C dans la documentation qui peut être vu à https://valadoc.org/clutter-1.0/Clutter.Image.set_data.html.
Si c'est pertinent, je peux inclure le code C que Vala crache, mais cela me semble correct.
Je commençais à penser que le ClutterImage
ne fonctionne pas, alors j'ai essayé l'exemple de https://github.com/GNOME/clutter/blob/master/examples/image-content.c avec mon fichier image que je pixbuf.save (...)
enregistré à l'aide et il fonctionne. Donc maintenant je pense qu'il se peut que j'essaie d'utiliser l'objet image comme un ClutterActor
dans un widget GtkClutterEmbed
. Il n'y a vraiment pas grand chose à voir là-bas, le code est moi
var embed = new GtkClutter.Embed();
viewport.add (embed);
var stage = embed.get_stage();
image = new Clutter.Image();
stage.content = image;
qui à l'air la même chose que ce qui est dans l'exemple qui fonctionne, en ce que la scène est un ClutterActor
et ClutterImage
est défini comme le contenu de l'acteur. Alors ... je suis un peu perdu maintenant.
Exemple simple
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;
}
Compilé en utilisant
valac --pkg cogl-1.0 --pkg clutter-gtk-1.0 --pkg gtk+-3.0 clutter-image-content.vala
L'image possède-t-elle un canal alpha? Si c'est le cas, il doit s'agir de RGBA_8888 et non de RGB_888. Si ce n'est pas le cas, postez un exemple court, complet et correct ( ). –
nemequ
Non, pas de canal alpha. Les données d'image proviennent d'une caméra qui fournit des informations sur les pixels Bayer RG8, qui ont été converties en une image RGB24. L'exemple que j'ai posté selon votre suggestion charge correctement une image qui a été convertie en Pixbuf et enregistrée dans un fichier. FWIW le repo est github.com/geoffjay/sentech-viewer. – geoffjay