在 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 小部件中以使其适用于(几乎)任何图像文件格式的最佳方法是什么?
What is the best approach to take a Magick++ Image and draw it in a GTK+3 widget, such that it would work for (just about) any image file format?
只要 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);
原始答案混合 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::Image (or Glade and Gtk::Builder
), and later change the image displayed in it with Gtk::Image::set 创建的空 Gtk::Image
,将它传递给你的 pixbuf。
我正在为 Linux 开发一个 C++ 图像查看器,它是使用 GTK+3 (gtkmm) 创建的 GUI 和 Magick++ 创建的图像处理。我的目标是支持尽可能多的图像文件格式,包括 GIF 动画。
获取 Magick++ 图像并将其绘制在 GTK+3 小部件中以使其适用于(几乎)任何图像文件格式的最佳方法是什么?
What is the best approach to take a Magick++ Image and draw it in a GTK+3 widget, such that it would work for (just about) any image file format?
只要 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);
原始答案混合 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::Image (or Glade and Gtk::Builder
), and later change the image displayed in it with Gtk::Image::set 创建的空 Gtk::Image
,将它传递给你的 pixbuf。