• ベストアンサー

バイナリファイル(画像)のよみこみ

レポートで1024×1024ピクセルの画像を、間引いて256×256の画像にしろというのが出されました。画像はrawファイルです。 それで、とりあえず画像を読み込んで、出力するプログラムを書いてみたんですが、コンパイルは出来るのに実行すると不正な処理とけいこくがでてきてしまいます。 ソースは #include<stdio.h> main() { unsigned char in[1024][1024],out[1024][1024]; FILE *fp; int i,j; fp=fopen("aaa.raw","rb"); fread(in,sizeof(unsigned char),1024*1024,fp); fclose(fp); for(i=0;i<1024;i++){ for(j=0;j<1024;j++) out[i][j]=in[i][j]; } fp=fopen("bbb.raw","wb"); fwrite(out,sizeof(unsigned char),1024*1024,fp); fclose(fp); } です。 どこがいけないのかアドバイスいただきたいです。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.3

こんにちわ。 #2 のmuyoshid です。 取りあえず、もう少し小さい単位でread/write する方法のプログラムを 記載してますので、参考にしてみて下さい。 ※ BUF_SZ の値を変更すると、read/write サイズを変更できます。 #include <stdio.h> #define IN_FILE   "aaa.raw" #define OUT_FILE  "bbb.raw" #define BUF_SZ   8192    // Buffer Size static int fcopy(FILE *, FILE *); main() {   FILE  *rfp, *wfp;   int   rinf;   rfp = fopen(IN_FILE, "rb");   if (((FILE *)NULL) == rfp) {     printf("File \"%s\" cannot open.\n", IN_FILE);     exit(-1);   }   wfp = fopen(OUT_FILE, "wb");   if (((FILE *)NULL) == wfp) {     printf("File \"%s\" cannot open.\n", OUT_FILE);     exit(-1);   }   rinf = fcopy(rfp, wfp);   fclose(rfp);   fclose(wfp);   printf("fcopy() = %d\n", rinf);   exit(rinf); } static int fcopy(FILE *rfp, FILE *wfp) {   unsigned char  in_buf[BUF_SZ], out_buf[BUF_SZ];   int       rinf;   while(!feof(rfp)) {     rinf = fread((void *)in_buf, 1, BUF_SZ, rfp);     if (rinf < 0) {       printf("File read error.\n");       return(-1);     }     memcpy((void *)out_buf, (void *)in_buf, BUF_SZ);     rinf = fwrite((void *)out_buf, 1, rinf, wfp);     if (rinf < 0) {       printf("File write error.\n");       return(-1);     }   }   return(0); }

sin11
質問者

お礼

わざわざありがとうございます。とても参考になりました。 何箇所か分からない関数もあったけど、なんとかなりました。 ありがとうございます。

その他の回答 (2)

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.2

こんにちわ。 mickjey2 さんもおっしゃられていますが、Stack Orverflow の可能性 が高いですね。 → ローカル変数が獲得される領域を超えて、変数を宣言したと言う事です。 解決策としては、  1) malloc で領域を獲得する。  2) in, out 変数をmain 関数の外で宣言する。  3) 一気にデータを読まずに、もう少し小さい単位でデータをread/write する。 といったところでしょうか?

sin11
質問者

お礼

回答ありがとうございます。 何とか動きました。

noname#11476
noname#11476
回答No.1

>unsigned char in[1024][1024],out[1024][1024]; 動的に malloc などで確保するようにしてみてください。 これでは一つの配列のサイズが、1Mbyteになります。 実行時にこのサイズが確保できていない可能性が高いです。 一般に静的に確保できる変数のサイズはそれほど大きくありません。

sin11
質問者

お礼

回答ありがとうございます。 お礼遅くなってすいません。mallocの使い方がわからなくて調べたりしてたら遅くなっちゃいました。 なんとか動きました。ありがとうございます。