2017-06-07 55 views
0

我試圖做我認爲會很平凡的事情,但不管我用ClutterImage嘗試什麼,我都會收到錯誤消息Unable to load image data。我使用的語言是Vala,因此Clutter的Vapi文件有可能是錯誤的。 GdkPixbuf我看起來不錯,我可以用它設置一個GtkImage,我可以將它保存到磁盤上而不會出錯,但是如果我將圖像文件讀回到GdkPixbuf - >ClutterImage,我會從Clutter中得到相同的錯誤。我也試過COGL_PIXEL_FORMAT_*的每一個值,它總是一樣的,雖然圖像數據格式爲RGB24,但我很積極。使用GdkPixbuf設置ClutterImage

我的代碼是:

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

圖像是否有alpha通道?如果是這樣,它需要是RGBA_8888而不是RGB_888。如果不是這樣,請發佈一個簡短的,自包含的正確示例()。 – nemequ

+0

不,沒有alpha通道。圖像數據來自相機,該相機提供拜耳RG8像素信息,並將其轉換爲RGB24圖像。根據您的建議發佈的示例正確加載了已轉換爲Pixbuf並保存到文件的圖像。 FWIW回購是github.com/geoffjay/sentech-viewer。 – geoffjay

回答

0

我不認爲這是雜亂更多相關的編譯,我認爲這個問題是有關我的視頻驅動程序不能正確加載和沒有圖形加速。我終於重新啓動並重建了Nvidia模塊,現在我沒有收到Unable to load data錯誤。我正在從Aravis圖書館獲得一個新圖書館,但這完全與此無關。不知道我是否應該刪除這個問題。