コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

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系のプログラム