2017-06-07 4 views
0

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 
+1

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

+0

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

Répondre

0

Je ne pense pas que cela est lié à Clutter plus, je pense que la question était liée à mon pilote vidéo ne pas être chargé correctement et ne pas avoir d'accélération graphique. J'ai finalement réussi à redémarrer et j'ai dû reconstruire les modules Nvidia, maintenant je ne reçois pas l'erreur Unable to load data. J'en obtiens un nouveau de la bibliothèque Aravis, mais cela n'a rien à voir avec ça. Je ne sais pas si je devrais simplement supprimer cette question ou non.