簡體   English   中英

在GTK + 3應用程序中顯示Magick ++圖像的首選方法是什么?

[英]What is the preferred approach to display a Magick++ Image in a GTK+3 application?

我正在為Linux使用C ++圖像查看器,它是使用GTK + 3(gtkmm)創建的GUI和使用Magick ++進行圖像處理的。 我的目標是支持盡可能多的圖像文件格式,包括動畫GIF。

拍攝Magick ++圖像並將其繪制在GTK + 3小部件中以使其適用於(幾乎)任何圖像文件格式的最佳方法是什么?

拍攝Magick ++圖像並將其繪制在GTK + 3小部件中以使其適用於(幾乎)任何圖像文件格式的最佳方法是什么?

只要ImageMagick具有格式委托,您就應該能夠繪制GtkWidget圖像。

image = Gtk::manage(new Gtk::Image());
// Load image into ImageMagick
Magick::Image img("wizard:");
/// Calculate how much memory to allocate
size_t to_allocate = img.columns() * img.rows() * 3;
// Create a buffer
guint8 * buffer = new guint8[to_allocate];
// Write pixel data to buffer.
img.write(0, 0, img.columns(), img.rows(), "RGB", Magick::CharPixel, buffer);
// Build a Pixbuf from pixel data in memory.
Glib::RefPtr<Gdk::Pixbuf> pBuff = Gdk::Pixbuf::create_from_data(buffer, Gdk::COLORSPACE_RGB, false, 8, img.columns(), img.rows(), img.columns()*3 );
// Set GtkImage from Pixbuf
image->set(pBuff);

來自Magick ++的GtkImage

原始答案混合C / C ++方法。

使用以下Magick ++方法簽名將像素數據導出到內存中。

Magick::Image.write(const ssize_t x_,
                    const ssize_t y_,
                    const size_t columns_,
                    const size_t rows_,
                    const std::string &map_,           //<= Usually "RGB"
                    const StorageType type_,           //<= Usually CharType
                    void *pixels_)                     //<= Be sure to allocate _all_ the memory required (size of storage * number of channels * columns * rows)

使用以下GTK方法從上面導出的像素中創建一個GdkPixBuf。

GdkPixbuf *
gdk_pixbuf_new_from_bytes (GBytes *data,               //<= Same as pixels_.
                           GdkColorspace colorspace,   //<= Match colorspace channels from map_.
                           gboolean has_alpha,         //<= Usually no.
                           int bits_per_sample,        //<= Match StorageType bits
                           int width,                  //<= Same as columns_.
                           int height,                 //<= Same as rows_.
                           int rowstride);             //<= size of data-type * number of channel * width.

最后,使用以下方法從PixBuf構建GtkImage。

GtkWidget * gtk_image_new_from_pixbuf (GdkPixbuf *pixbuf);

我想@emcconville適合ImageMagick部分,因為我對此一無所知。

但是,對於GTKmm部分,您將要堅持使用C ++ API,因此請使用Gdk :: Pixbuf :: create_from_data從ImageMagick讀取圖像。

另外,在創建圖像查看器時,您將需要更改Gtk::Image顯示的Gtk::Image 因此,在啟動時只需使用由Gtk :: Image :: Image (或Glade和Gtk::Builder )創建的空Gtk::Image ,然后使用Gtk :: Image :: set更改其中顯示的圖像,並將其傳遞給您pixbuf的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM