通常はGdk::Pixbuf::create_from_file()を用いて画像ファイルを読み込むことが
出来るが、ファイルサイズが大きい画像を別スレッドで読み込みたい時や、画像の幅や高さだけを
知りたい時などにはGdk::PixbufLoaderを使用すると便利である。
Gdk::PixbufLoader::write()でデータを入力し、Gdk::PixbufLoader::close()で終了する。
その後Gdk::PixbufLoader::get_pixbuf()でGdk::PixBufを取得できる。また画像の幅や高さ
を取得したらGdk::PixbufLoader::signal_size_prepared()がemitされる。
ploader.cpp
#include
#include
void on_size_prepared( int w, int h ){
std::cout << "on_size_prepared width = " << w << " height = " << h << std::endl;
int main( int argc, char *argv[] )
Gtk::Main kit( argc, argv );
Glib::RefPtr< Gdk::PixbufLoader > loader = Gdk::PixbufLoader::create();
loader->signal_size_prepared().connect( sigc::ptr_fun( &on_size_prepared ) );
FILE* f = fopen( "./test.png", "rb" );
if( f ){
const size_t bufsize = 4096;
size_t rsize;
guint8 data[ bufsize ];
while( ( rsize = fread( data, 1, bufsize, f ) ) ){
std::cout << "read " << rsize << " byte\n";
loader->write( data, rsize );
loader->close();
Glib::RefPtr< Gdk::Pixbuf > pixbuf = loader->get_pixbuf();
std::cout << "width = " << pixbuf->get_width() << " height = " << pixbuf->get_height() << std::endl;
fclose( f );
return 0;
g++ ploader.cpp -o ploader `pkg-config gtkmm-2.4 --cflags --libs`
$ ./ploader
read 4096 byte
on_size_prepared width = 320 height = 240
read 4096 byte
read 4096 byte
read 4096 byte
read 4096 byte
read 4096 byte
read 4096 byte
read 4096 byte
read 4096 byte
read 4096 byte
read 2724 byte
width = 320 height = 240
この様に、ファイルを全て読み込まなくても幅と高さを取得できていることが分かる。