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

时间:2018-03-02 09:49:34

标签: c++ gtk gtk3 magick++ gtkmm3

我正在研究用于Linux的C ++图像查看器,它是使用GTK + 3(gtkmm)创建GUI和Magick ++进行图像处理的。我的目标是支持尽可能多的图像文件格式,包括动画GIF。

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

2 个答案:

答案 0 :(得分:2)

  

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

只要ImageMagick具有格式委托,您就应该能够绘制GtkWidget图像。

logging:
 level:
    package:
        name: DEBUG
 path: ${project_home}/logs
 pattern:
  console: "${CONSOLE_LOG_PATTERN:%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %maskedM%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}}"
  file: "${FILE_LOG_PATTERN:%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:%5p} ${PID:- } --- [%t] %-40.40logger{39} : %maskedM%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}}"

GtkImage from Magick++

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

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

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);

使用以下GTK方法从上面导出的像素创建GdkPixBuf。

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)

最后,使用以下方法从PixBuf构建GtkImage。

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.

答案 1 :(得分:1)

我认为@emcconville适合ImageMagick部分,因为我对此一无所知。

但是对于GTKmm部分,您需要坚持使用C ++ API,因此请使用Gdk::Pixbuf::create_from_data从ImageMagick中读取图像。

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