首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Magick++应用程序中显示GTK+3图像的首选方法是什么?

在Magick++应用程序中显示GTK+3图像的首选方法是什么?
EN

Stack Overflow用户
提问于 2018-03-02 09:49:33
回答 2查看 505关注 0票数 2

我正在为Linux开发一个C++图像查看器,它是使用GTK+3 (gtkmm)创建的,用于图形用户界面,Magick++用于图像处理。我的目标是支持尽可能多的图像文件格式,包括动画GIF。

获取Magick++图像并在GTK+3小部件中绘制它的最佳方法是什么,这样它可以工作(几乎)任何图像文件格式?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-02 13:31:45

获取Magick++图像并在GTK+3小部件中绘制它的最佳方法是什么,这样它可以工作(几乎)任何图像文件格式?

只要ImageMagick有格式委托,就可以绘制GtkWidget图像。

代码语言:javascript
运行
复制
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);

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

使用下面的Magick++方法签名将像素数据导出到内存中。

代码语言:javascript
运行
复制
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。

代码语言:javascript
运行
复制
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.

最后,使用下面的方法从GtkImage构建一个PixBuf。

代码语言:javascript
运行
复制
GtkWidget * gtk_image_new_from_pixbuf (GdkPixbuf *pixbuf);
票数 2
EN

Stack Overflow用户

发布于 2018-03-02 14:57:13

我认为@emcconville对ImageMagick部分是正确的,因为我对此一无所知。

但是,对于GTKmm部分,您需要坚持使用C++ API,所以使用数据从ImageMagick读取图像。

此外,在创建图像查看器时,需要更改Gtk::Image显示的图像。因此,在启动时,只需使用用Gtk::Image创建的空Gtk::Image::Image (或Glade和Gtk::Builder),然后用Gtk::Image::set更改其中显示的图像,并将其传递给您的像素。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49066611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档