carcon999のブログ

12年間Y!ブログの記載を移行しました。電子工作関連の記事が多いです。

JPEG保存の処理

ryoさんからの質問で、SH-2Aでjpeglibを利用して画像を圧縮したい!ということですが、コメントに文字制限があり、貼れなかったので本文に。

私の場合、以下のような関数を作り保存しています。どうでしょうか?ヒントになりますか?
これは、Toファイルですが、Toメモリも作りました。(まあ同じでしょうが・・)
ただし、私の場合、外部の拡張RAMでJPEG圧縮処理を行っています。
(ガイガーばかりで、忘れていましたが、これを整理しようと思ってたんですよね。時間ができたら整理します。)

int compless_jpeg_to_file(char *fname, int quality)
{
struct jpeg_compress_struct cinfo; // 圧縮ファイル
struct jpeg_error_mgr jerr;
unsigned char* pBuff = NULL;
unsigned long size = 0;
int row_stride = 0;

FRESULT result;
UINT cnt;
FIL File; /* ファイルオブジェクト */

memset(&cinfo, 0x00, sizeof(cinfo));

// JPEGオブジェクトの生成
cinfo.err = jpeg_jsp_error(&jerr);
jpeg_create_compress(&cinfo);

// ファイルへの出力
result = f_open(&File, fname, FA_CREATE_ALWAYS|FA_WRITE);

// 出力先をファイル指定
jpeg_stdio_dest( &cinfo, &File );

cinfo.image_width = 320;
cinfo.image_height = 240;
cinfo.input_components = 3;
cinfo.in_color_space = JCS_RGB;

jpeg_set_defaults( &cinfo );

// Jpeg画質設定
jpeg_set_quality(&cinfo, quality, TRUE);

// エンコード開始
jpeg_start_compress(&cinfo, TRUE);

// 1ラインごとに処理する。
{
volatile JSAMPARRAY buffer;
volatile JSAMPROW row;
volatile JSAMPLE img[320][3];
volatile _UWORD* p = (_UWORD*)RAM_EXT_TFT_SAVE;
int i, j;

row = (JSAMPROW)&img[0][0];
buffer = (JSAMPARRAY)&row;

for(i = 0 ; i < 240 ; i++)
{
for(j = 0 ; j < 320 ; j++)
{
img[j][0] = (_UBYTE)(((*p >> 8) & 0x00F8)); // R
img[j][1] = (_UBYTE)(((*p >> 3) & 0x00FC)); // G
img[j][2] = (_UBYTE)(((*p << 3) & 0x00F8)); // B
p++;
}

jpeg_write_scanlines( &cinfo, buffer, 1);
}
}

// 終了
jpeg_finish_compress( &cinfo );

// Jpegオブジェクト破棄
jpeg_destroy_compress( &cinfo );

// ファイルを閉じる
f_close(&File);

return 0;
}