Kreslení obrázků
Existuje metoda pro kreslení z Gdk::Pixbuf do Cairo::Context. Vyrovnávací paměť Gdk::Pixbuf je užitečná jako obal okolo množiny pixelů tvořících obrázek, které můžete načíst ze souboru a pak s nimi různým způsobem pracovat.
Probably the most common way of creating Gdk::Pixbufs is to use Gdk::Pixbuf::create_from_file() or Gdk::Pixbuf::create_from_resource(), which can read an image file, such as a png file into a pixbuf ready for rendering.
Gdk::Pixbuf lze vykreslit jeho nastavením jako zdrojového vzorku v kontextu Cairo pomocí Gdk::Cairo::set_source_pixbuf(). Pak obrázek nakreslíte pomocí Cairo::Context::paint() (nakreslí celý obrázek), nebo pomocí Cairo::Context::rectangle() a Cairo::Context::fill() (vyplní určený obdélník). set_source_pixbuf() není členská metoda z Cairo::Context. Jako první parametr je vyžadován Cairo::Context.
Zde je malý kousek kódu, který dává vše dohromady: (Samozřejmě, že obvykle byste obrázek v obsluze kreslicího signálu nenačítali pokaždé! Zde je to jen proto, aby bylo ukázané vše pohromadě.)
void MyArea::on_draw(const Cairo::RefPtr<Cairo::Context>& cr, int width, int height) { auto image = Gdk::Pixbuf::create_from_file("myimage.png"); // Draw the image at 110, 90, except for the outermost 10 pixels. Gdk::Cairo::set_source_pixbuf(cr, image, 100, 80); cr->rectangle(110, 90, image->get_width()-20, image->get_height()-20); cr->fill(); }
- 16.6.1. Příklad
16.6.1. Příklad
Here is an example of a simple program that draws an image. The program loads the image from a resource file. See the Gio::Resource and glib-compile-resources section. Use glib-compile-resources to compile the resources into a C source file that can be compiled and linked with the C++ code. E.g.
$ glib-compile-resources --target=resources.c --generate-source image.gresource.xml
File: myarea.h (For use with gtkmm 4)
#ifndef GTKMM_EXAMPLE_MYAREA_H #define GTKMM_EXAMPLE_MYAREA_H #include <gtkmm/drawingarea.h> #include <gdkmm/pixbuf.h> class MyArea : public Gtk::DrawingArea { public: MyArea(); virtual ~MyArea(); protected: void on_draw(const Cairo::RefPtr<Cairo::Context>& cr, int width, int height); Glib::RefPtr<Gdk::Pixbuf> m_image; }; #endif // GTKMM_EXAMPLE_MYAREA_H
File: main.cc (For use with gtkmm 4)
#include "myarea.h" #include <gtkmm/application.h> #include <gtkmm/window.h> class ExampleWindow : public Gtk::Window { public: ExampleWindow(); protected: MyArea m_area; }; ExampleWindow::ExampleWindow() { set_title("DrawingArea"); set_default_size(300, 200); set_child(m_area); } int main(int argc, char** argv) { auto app = Gtk::Application::create("org.gtkmm.example"); return app->make_window_and_run<ExampleWindow>(argc, argv); }
File: myarea.cc (For use with gtkmm 4)
#include "myarea.h" #include <cairomm/context.h> #include <giomm/resource.h> #include <gdkmm/general.h> // set_source_pixbuf() #include <glibmm/fileutils.h> #include <iostream> MyArea::MyArea() { try { // The fractal image has been created by the XaoS program. // http://xaos.sourceforge.net m_image = Gdk::Pixbuf::create_from_resource("/image/fractal_image.png"); } catch(const Gio::ResourceError& ex) { std::cerr << "ResourceError: " << ex.what() << std::endl; } catch(const Gdk::PixbufError& ex) { std::cerr << "PixbufError: " << ex.what() << std::endl; } // Show at least a quarter of the image. if (m_image) { set_content_width(m_image->get_width()/2); set_content_height(m_image->get_height()/2); } // Set the draw function. set_draw_func(sigc::mem_fun(*this, &MyArea::on_draw)); } MyArea::~MyArea() { } void MyArea::on_draw(const Cairo::RefPtr<Cairo::Context>& cr, int width, int height) { if (!m_image) return; // Draw the image in the middle of the drawing area, or (if the image is // larger than the drawing area) draw the middle part of the image. Gdk::Cairo::set_source_pixbuf(cr, m_image, (width - m_image->get_width())/2, (height - m_image->get_height())/2); cr->paint(); }
File: image.gresource.xml (For use with gtkmm 4)
<?xml version="1.0" encoding="UTF-8"?> <gresources> <gresource prefix="/image"> <file>fractal_image.png</file> </gresource> </gresources>