Mar.15.2000
libpng の基本とその使用方法。
画像データをファイルに保存する手段として libpng を扱う実験。
特に GdkPixbuf のデータを libpng で保存する方法。
純粋に書き出せれば良いので、本当に基礎的な事のみ扱う。
libpng は PNG形式の画像ファイルを取り扱う為のライブラリです。
これを用いることにより比較的容易に PNG 形式を読み書きするプログラムが
作成できます。
GdkPixbuf のバッファで保持されている画像を libpng によって PNG 形式で セーブする関数です。下記ソースを参照してください。
void png_save(GdkPixbuf *pic, gchar *fname) { FILE *fp; png_structp png_ptr; png_infop info_ptr; fp = fopen(fname, "wb"); if (fp == NULL) { return; } png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (png_ptr == NULL) { fclose(fp); return; } info_ptr = png_create_info_struct(png_ptr); if (info_ptr == NULL) { fclose(fp); png_destroy_write_struct(&png_ptr, (png_infopp)NULL); return; } if (setjmp(png_ptr->jmpbuf)) { fclose(fp); png_destroy_write_struct(&png_ptr, (png_infopp)NULL); return; } /* ----- libpng にストリームを渡す */ png_init_io(png_ptr, fp); /* ----- png タイプの設定 */ if (gdk_pixbuf_get_has_alpha(pic) == TRUE) { png_set_IHDR(png_ptr, info_ptr, gdk_pixbuf_get_width(pic), gdk_pixbuf_get_height(pic), 8, PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); } else { png_set_IHDR(png_ptr, info_ptr, gdk_pixbuf_get_width(pic), gdk_pixbuf_get_height(pic), 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); } /* ----- インフォメーションヘッダー書出し */ png_write_info(png_ptr, info_ptr); /* ----- ピクセル書出し */ { png_uint_32 k, height; png_bytep row_pointers[gdk_pixbuf_get_height(pic)]; height = gdk_pixbuf_get_height(pic); for(k=0; k<height; k++) { row_pointers[k] = gdk_pixbuf_get_pixels(pic) + (gdk_pixbuf_get_rowstride(pic) * k); } png_write_image(png_ptr, row_pointers); } /* ----- 書き出しの終了、後始末 */ png_write_end(png_ptr, info_ptr); png_destroy_write_struct(&png_ptr, (png_infopp)NULL); fclose(fp); return; }