- 締切済み
libjpegライブラリの使い方について
libjpegライブラリを使って、画像を読み込んで、縮小表示したいと考えています。 libjpegを使えば、1/2,1/4,1/8は簡単にできると聞いていますが、やり方がわかりません。 優しい回答をいただけないでしょうか? ちなみにいかに作ってみたコードを示します。 このコードは1/8に設定していますが、実行しても出力される画像が1/2となってしまいます。 どうすればよいでしょうか? #include <stdio.h> #include <stdlib.h> #include <memory.h> #include <jpeglib.h> void main() { struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; FILE *outfile; JSAMPARRAY img; int i, j; // イメージを保持するメモリ領域の確保と初期化 img = (JSAMPARRAY)malloc( sizeof( JSAMPROW ) * 256 ); for ( i = 0; i < 256; i++ ) { img[i] = (JSAMPROW)malloc( sizeof( JSAMPLE ) * 3 * 256 ); for ( j = 0; j < 256; j++ ) { img[i][ j * 3 + 0 ] = i; img[i][ j * 3 + 1 ] = 0; img[i][ j * 3 + 2 ] = j; } } // JPEGオブジェクトの初期化 cinfo.err = jpeg_std_error( &jerr ); jpeg_create_compress( &cinfo ); // ファイルを開く outfile = fopen( "a.jpg", "wb" ); jpeg_stdio_dest( &cinfo, outfile ); // パラメータの設定 cinfo.image_width = 256; cinfo.image_height = 256; cinfo.input_components = 3; cinfo.in_color_space = JCS_RGB; // デフォルト値の設定 jpeg_set_defaults( &cinfo ); cinfo.scale_num = 1; cinfo.scale_denom = 8; // 圧縮の開始 jpeg_start_compress( &cinfo, TRUE ); // 全イメージデータを出力 jpeg_write_scanlines( &cinfo, img, 256 ); // 圧縮の終了 jpeg_finish_compress( &cinfo ); // JPEGオブジェクトの破棄 jpeg_destroy_compress( &cinfo ); // ファイルを閉じる fclose( outfile ); // イメージデータを保持するメモリ領域を開放 for ( i = 0; i <256; i++ ) free( img[i] ); free( img ); }
- みんなの回答 (1)
- 専門家の回答
みんなの回答
私もよく理解してはいないので,以下は参考までに. scale_num/scale_denomは画像の縮小というより低ビットレート向けの画像圧縮が目的で,必要以上に画質を落とさないよう1/2未満に縮小できないようにしてあるのかもしれません. 下のWebページを見るとscale_num/scale_denomが導入されたのはlibjpeg ver.7です. http://en.wikipedia.org/wiki/Libjpeg その参照文献であるITU-T JPEG-Plus Proposal for Extending ITU-T T.81 for Advanced Image(p.11)によれば, So the low-bitrate compression mode consists of following steps: (1) choose N = 9…16; (2) cjpeg (compress jpeg) –scale 8/N (downscale); (3) djpeg (decompress jpeg) –scale N/8 (upscale). とあるので,compression時に8/16(つまり1/2)未満にすることは想定していないように見えます. しかし,試してみるとdecompressionのパラメータに設定するscale_num/scale_denomは1/8サイズに展開できるようです.それを使って画像を読み込むときに縮小するか,あるいは自前で縮小処理を実装するのが良いのではないでしょうか.