画像のアルファ合成
概要
cairommを使って2つの画像のアルファ合成をおこなう。基本的にはファイルから画像を読み込んで表示と同様に行うが、 2つ目の画像を描画するときCairo::Context::paint()の代わりに Cairo::Context::paint_with_alpha()を使用する。
ソース
cairoimg2.cpp
#include <gtkmm.h>
class MyDrawArea : public Gtk::DrawingArea
{
Glib::RefPtr< Gdk::Pixbuf > m_pixbuf;
Glib::RefPtr< Gdk::Pixbuf > m_pixbuf2;
public:
MyDrawArea();
protected:
virtual bool on_expose_event( GdkEventExpose* e );
};
MyDrawArea::MyDrawArea()
{
// 画像読み込み
try {
m_pixbuf = Gdk::Pixbuf::create_from_file( "./test.jpg" );
m_pixbuf2 = Gdk::Pixbuf::create_from_file( "./test2.jpg" );
}
catch(...)
{
Glib::exception_handlers_invoke();
exit(1);
}
}
bool MyDrawArea::on_expose_event( GdkEventExpose* event )
{
const double alpha = 0.5; // ブレンド比率
int width = get_width();
int height = get_height();
Cairo::RefPtr< Cairo::Context > cairoctx = get_window()->create_cairo_context();
Gdk::Cairo::set_source_pixbuf( cairoctx, m_pixbuf->scale_simple( width, height, Gdk::INTERP_NEAREST ), 0, 0 );
cairoctx->paint();
Gdk::Cairo::set_source_pixbuf( cairoctx, m_pixbuf2->scale_simple( width, height, Gdk::INTERP_NEAREST ), 0, 0 );
cairoctx->paint_with_alpha( alpha );
return true;
}
class MainWin : public Gtk::Window
{
MyDrawArea m_drawarea;
public:
MainWin(){
add( m_drawarea );
show_all_children();
}
};
int main( int argc, char *argv[] )
{
Gtk::Main kit( argc, argv );
MainWin mainwin;
Gtk::Main::run( mainwin );
return 0;
}
g++ cairoimg2.cpp -o cairoimg2 `pkg-config gtkmm-2.4 --cflags --libs`
結果