2009年03月31日

libjpegでSDL_SurfaceのSDL_Rectをセーブする。

jpegのセーブに関しては苦労してまでメモリに保存する需要はあまりない。
但しココログを考慮してexifをくっつけたいところではある。
そんなことを視野に入れつつ今回はとりあえず標準的なAPIでのセーブを行った。

先日のロードとは異なりSDL_Surface直接ではなく
1ラインずつを全SDL_Surfaceでなく任意の矩形を選択した。
メモリーの無駄は多分にあるが妥協できる線だ。
とりあえず

struct jpeg_compress_struct jcomp;
JSAMPROW line;

が必要となる。

サンプルの類はjpeg_compress_structもcinfoにしているのだが
jpeg_decompress_structでその名前を使っちゃったので「jcomp」にした。
ほんとは「dinfo」と「cinfo」にすべきだったのかもしれないが
これはあとで整理して今回は「jcomp」で通した。

下準備、ビデオサーフィスのコピーでもいいけれどまだちょっと消化しきっていないので
オフラインに32bitカラーのサーフィスを生成
srcにはimg1が入っている。


W=SCREEN_WIDTH;
H=SCREEN_HEIGHT;

img2=SDL_CreateRGBSurface(SDL_SWSURFACE, W, H, 32, rmask, gmask, bmask,amask);
SDL_BlitSurface( img1, &src, img2, &dst );

src.x = 180;src.y = 120;
src.w = 320;src.h = 240;




line = (JSAMPROW)malloc( sizeof( JSAMPLE ) * 3 * src.w +4);
k=W<<2;
bits=img2->pixels+src.y*k+src.x*4 ;


SDL_Surfaceからコピー開始するアドレスをbitsに納める。
またdecompress時同様1ライン分の加算値をkに納める。


fp = fopen( "a.jpg", "wb" );

保存するファイルを開く。ソケットなどであればクライアントにかえす形


jcomp.err = jpeg_std_error( &jerr );
jpeg_create_compress( &jcomp );
jpeg_stdio_dest( &jcomp, fp );
jcomp.image_width = src.w;
jcomp.image_height = src.h;
jcomp.input_components = 3;
jcomp.in_color_space = JCS_RGB;

jpeg_set_defaults( &jcomp );
jpeg_set_quality(&jcomp, 90, TRUE);
jcomp.write_JFIF_header=FALSE;
jpeg_start_compress( &jcomp, TRUE );

qualityはpropertyではなくて関数として設定した。
FIFは重要な情報は無いので省いた。他のパラメータは勉強不足
jpeg_start_compressの段階でヘッダー部の書き込みはされない模様。
つまりexifを書き込むためにはやっぱり関数設定が必要の様ですが今回パス

サイズなどは矩形情報をそのまま使いまわす。

書き込み実施部4byteブロックのSDLSurfaceからlineに転送している。

for ( i = 0; i < src.h; i++ ) {
for ( j = 0; j < src.w; j++ ) {
pix=*(int*)(bits+4*j);
*(int*)(line+3*j)=pix;
}
jpeg_write_scanlines( &jcomp , &line, 1 );
bits+=k;
}

1ラインずつにしているのはメモリーの節約だが
jpegの特性上DCTは8ライン単位で行うのでjpeg出力用に
ビットマップ一面分用意して32bitイメージであるならば24biteとして「つめて」しまうのも手だろう。

jpeg_finish_compress( &jcomp );
jpeg_destroy_compress( &jcomp );

fclose(fp);
free(line);

後処理、
一般的な画像ソフトでもqualityくらいしかいじれないが
smoothとかoptimize指示とか有効に使えば画質が向上すると思われる。
ちょっと今回のコードは荒いけれど
sdlの任意の矩形の保存というのは結構現実的ではなかろうか

もうちょっとlibjpegとうまく付き合う方法を検討する。


ラベル:SDL 画像 libjpeg
posted by Xo_ox at 23:59| Comment(0) | クロスプラットフォーム | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。