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

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

画像の表示

NDSjpeg画像の表示をやってみようかなと思って、ソースをMakeしてみた。ソースはいつ手に入れたか忘れてしまったが、gba-jpeg-decodeというもの。ソースだけあって何もわからなかったが、ソースを眺めていると、そのままMakeすれば動きそうである。
そこで、プロジェクトを作ってDevkitProでMake。エラーも何も出ないでコンパイル終了。作業時間15分くらい。
それじゃ、jpegファイルを読み込んで表示するプログラムを作ってみようかなと思い、作ってみました。こんな感じ。

int jpgView( char* jpgfilename, uint16 *screen, int gx, int gy, int gwidth, int gheight, int mx, int my )
{
FILE *fp = NULL;
char *jpgdata = NULL;
int	mWidth, mHeight;
long	fsize;
JPEG_Decoder decoder;

  fp = fpOpen( "", jpgfilename, 0 );
  if( fp==NULL ){
    ShinoPrintCenter( SubScreenA, 128, 4*12, (u8 *)"Jpeg file is not found.", RGB(31,0,0), RGB(31,31,31), 1 );
    while(1);
  }
  fseek( fp, 0, SEEK_END );
  fsize = ftell( fp );
  rewind( fp );

  if( fsize>98304*2 ){
    ShinoPrintCenter( SubScreenA, 128, 4*12, (u8 *)"Jpeg file size is too large.", RGB(31,0,0), RGB(31,31,31), 1 );
    while(1);
  }
  jpgdata = (char*)ImageBuf0;
  fread( (void*)jpgdata, fsize, sizeof(unsigned char), fp );
  fclose( fp );

  if( !JPEG_Decoder_ReadHeaders( &decoder, (const unsigned char **)&jpgdata ) ){
    return( -1 );
  }
  if( decoder.frame.width>256 ){  mWidth = 256;  }else{ mWidth = decoder.frame.width;   }
  if( decoder.frame.height>384 ){ mHeight = 384; }else{ mHeight = decoder.frame.height; }

  if( !JPEG_Decoder_ReadImage (&decoder, (const unsigned char **)&jpgdata, ImageBuf1, mWidth, mHeight ) ){
    return( -1 );
  }
  cpyg( ImageBuf1, screen, gx, gy, gwidth, gheight,  mx, my, mWidth, mHeight );
  return( 0 );
}

最初、malloc()を使って作ったのですが、DevkitProってmalloc()がダメダメ?な感じなので、とりあえず、強引にメモリ確保して作りました。これじゃ、あんまり使えないなぁ。

また、gba-jpeg-decodeって、256幅を超える画像はうまくデコードしてくれないみたいなので、やっぱり時間のあるときに、jpegの展開プログラムをきちんと作りたいなと思います。
ちなみに、jpegデータを表示した画像です。

  jpgView( "a.jpg", MainScreenA, 0, 0, 256, 192, 0, 0 );
  jpgView( "a.jpg", SubScreenA, 0, 0, 256, 192, 0, 193 );

上を実行して、下の画像。

使い道が無いなぁ・・・。

本当にやりたいことリスト

(ブログの終わりにやりたいことを書いておきたいと思います)

  • 求職活動・・・このブログで興味を持った人一声かけてください。m(_ _)m
  • Androidプログラム
  • Web系のプログラム