ndsでのjpeg表示に再挑戦(7)
jpegのライブラリ部分がDevkitProでmakeが通ったので、実際のjpegファイルを食べさせてpmmファイルを吐き出させるプログラム作ってみました。
jpeg2pmm( FILE *inFp, FILE *outFp )
jpeg2pmmというプログラムです。とりあえず、テスト的に作ったものなのでまだ修正します。
int jpeg2pmm( FILE *inFp, FILE *outFp ) { struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; djpeg_dest_ptr dest_mgr = NULL; JDIMENSION num_scanlines; //Initialize the JPEG decompression object with default error handling. cinfo.err = jpeg_std_error( &jerr ); jpeg_create_decompress( &cinfo ); //Add some application-specific error messages (from cderror.h) jerr.addon_message_table = cdjpeg_message_table; jerr.first_addon_message = JMSG_FIRSTADDONCODE; jerr.last_addon_message = JMSG_LASTADDONCODE; //Insert custom marker processor for COM and APP12. //jpeg_set_marker_processor(&cinfo, JPEG_COM, print_text_marker); //jpeg_set_marker_processor(&cinfo, JPEG_APP0+12, print_text_marker); //Specify data source for decompression jpeg_stdio_src( &cinfo, inFp ); ShinoUpPrint( SubScreenA, (u8 *)"ヘッダの読み込み", RGB(31,31,31),RGB(0,0,0), 1,RGB(0,0,0) ); //Read file header, set default decompression parameters (void) jpeg_read_header(&cinfo, TRUE); //Set up JPEG parameters. /* cinfo.desired_number_of_colors = 255; cinfo.quantize_colors = TRUE; cinfo.dct_method = JDCT_ISLOW; //cinfo.two_pass_quantize = FALSE; //cinfo.dither_mode = JDITHER_ORDERED; //cinfo.do_fancy_upsampling = FALSE; */ cinfo.scale_num = 1; cinfo.scale_denom = 2; //画質よりも速度重視のパラメータ(-fast) cinfo.desired_number_of_colors = 216; cinfo.dct_method = JDCT_FASTEST; cinfo.do_fancy_upsampling = FALSE; cinfo.two_pass_quantize = FALSE; ShinoUpPrint( SubScreenA, (u8 *)"PPM出力初期化", RGB(31,31,31),RGB(0,0,0), 1,RGB(0,0,0) ); dest_mgr = jinit_write_ppm( &cinfo ); dest_mgr->output_file = outFp; // 展開開始 ShinoUpPrint( SubScreenA, (u8 *)"展開開始", RGB(31,31,31),RGB(0,0,0), 1,RGB(0,0,0) ); jpeg_start_decompress( &cinfo ); ShinoUpPrint( SubScreenA, (u8 *)"ヘッダの書き込み", RGB(31,31,31),RGB(0,0,0), 1,RGB(0,0,0) ); /* Write output file header */ (*dest_mgr->start_output) (&cinfo, dest_mgr); ShinoUpPrint( SubScreenA, (u8 *)"画像データの書き込み", RGB(31,31,31),RGB(0,0,0), 1,RGB(0,0,0) ); /* Process data */ while (cinfo.output_scanline < cinfo.output_height) { num_scanlines = jpeg_read_scanlines( &cinfo, dest_mgr->buffer, dest_mgr->buffer_height ); (*dest_mgr->put_pixel_rows) (&cinfo, dest_mgr, num_scanlines); } (*dest_mgr->finish_output) (&cinfo, dest_mgr); (void) jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); return( true ); }
cinfo.の展開パラメータの設定は、速度重視設定となっています。画像の大きさは1/2にしています。美人さんの画像が590×450あるので、nds画面にテスト描画するための半分にしてみました。あと、コメントは読み込まないです。
後はエラー処理を考えなければならないですね。今日はこの辺で。
本当にやりたいことリスト
(ブログの終わりにやりたいことを書いておきたいと思います)
- 求職活動・・・このブログで興味を持った人一声かけてください。m(_ _)m
- Androidプログラム
- Web系のプログラム