• 締切済み

ビットマップファイルの読み書き(C言語)

以下のサイトの関数を利用させていただき、ビットマップファイルの読み書きを行ったのですが、 書き出されたビットマップファイルが0バイトのデータなしファイルになってしまいました。 読み込まれた画像データのRGB値を変更するなどの処理を行いたいので、RGB値を操作するにはどうすればよいかなども、 具体的に教えていただければ幸いです。 以下、作成したmain関数です。 int main(void) { Picture* bmap; FILE *filepass; if((filepass = fopen("test.bmp", "rb"))==NULL){ printf("file open err\n"); exit(0); } bmap = getBmp(filepass); filepass = fopen("test2.bmp", "wb"); bmap = putBmp(filepass, bmap); fclose(filepass); return 0; } 他力本願で申し訳ないのですが、ご回答をお願いします。

みんなの回答

  • a-gamyl
  • ベストアンサー率32% (17/53)
回答No.2
skk004
質問者

お礼

ありがとうございます。 これを参考に、もう少し自力で考えてみます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

putBmp の中身を調べろ, としか言えない.... ちなみにビットマップファイルの構造*そのもの*はちょっと検索すれば見付かるはず.

skk004
質問者

補足

申し訳ありません、ホームページのURLを載せ忘れました。 ttp://www.mm2d.net/c/c-12.shtml

関連するQ&A

  • C言語のファイルの読み書き

    以下のようなプログラムを作成したいのですが、どうしても作成できません。 さまざまなサイトを参考にしたのですが、まったく理解できませんでした。 具体的なプログラム式をご教授願います。 よろしくおねがいします…。 1)複数の学生の情報を読み取り配列を行う struct student a [LIST_SIZE_A] 2)配列に代入した情報をファイルに書き込む fopen("…","w"); … fclose() 3)配列に代入した情報をファイルに追加する fopen("…","a"); … fclose() 4)ファイルの内容を表示する fopen("…","r")

  • c言語による画像処理について

    いつもお世話になってます。 c言語を使った画像処理を学び始めました。 入力画像の白(RGB値255,255,255)以外の画像を黒(RGB値0,0,0) に変換するプログラムを作成したいと思っているのですが、 入力画像の大きさによっては正常に命令を実行してくれないことがあるので、 改善点をご教示いただきたいと考え投稿させていただきました。ソースプログラムは #include<stdio.h> #define nx 100 //画像の幅 #define ny 100 //画像の高さ int main(void) { FILE *fp,*fp2; int i,j; unsigned char header[54]; unsigned char screen[nx][ny][3]; /* ファイルから読む */ fp=fopen("input.bmp","rb"); //ビットマップ形式 ,24ビットカラー fread(header,1,54,fp); // ヘッダ(54バイト)を飛ばす */ fread(screen,1,nx*ny*3,fp); // 残りはデータ(最下行から順に入る) //(255,255,255)以外なら黒(0,0,0)に for(j=0;j<ny;j++) for(i=0;i<nx;i++) if(screen[j][i][0]!=255||screen[j][i][1]!=255||screen[j][i][2]!=255){ screen[j][i][0]=0; screen[j][i][1]=0; screen[j][i][2]=0; } fclose(fp); /* ファイルに書く */ fp=fopen("output.bmp","wb"); fwrite(header,1,54,fp); /* ヘッダ */ fwrite(screen,1,nx*ny*3,fp); /* データ */ fclose(fp); return 0; } となっています。ここで、画像の高さ、幅を100以下にすると正常に変換できなくなります。 どなたか原因がお分かりでしたらお知らせ願えないでしょうか?

  • C言語でファイル読み書きを早くしたい。

    いつも利用させてもらって助かっています。 あるプログラムを作成しているのですが、ファイル入力の部分がネックとなってしまって、全体が使いものにならない状況に陥っています。 たくさんのデータをfread1回で読み込むことにより、読み込み速度はずいぶんと改善されましたが、まだ圧倒的に遅い状況です。システムコールを使いましたが、ほとんど改善されませんでした。 読み込み/書き込みの速度を改善する方法として,SSDメモリを使ったりする方法があると思いますが,プログラムの観点から改善できるところはないでしょうか? 下に、ファイル読み込みの部分だけ記述したコードを添付させて頂いたので、改善できる点があれば、御指摘頂けると助かります。 なお、前提として, (1)データはスタック領域だと不足するので、ヒープ領域に確保 (2)データファイルは改行無しの一連のデータ とします。 ちなみに、環境は OS   : CentOS5.3 memory   : 6GB コンパイラ : gcc です。 よろしくお願いします。 //----------------------------------------------------- //通常バージョン #include <stdio.h> #include <stdlib.h> #define SIZE (512*1024*1024) //500MB int main(void) { unsigned long int i; unsigned char *data; FILE *fp; data = (unsigned char *)malloc(SIZE); if(data == NULL) { printf("メモリが確保できません\n"); exit(EXIT_FAILURE); } fp = fopen("filein.dat", "rb"); fread( data, sizeof( unsigned char), (int)SIZE, fp ); fclose(fp); /* //表示 for( i=0; i<SIZE; i++ ){ printf("%2x", data[i]); } puts(""); */ fp = fopen("fileout.dat", "w"); fwrite( data, sizeof( unsigned char), (int)SIZE, fp); fclose(fp); free(data); return 0; } //----------------------------------------------------- //readシステムコールを使ったバージョン #include <stdio.h> #include <stdlib.h> #define SIZE (512*1024*1024) //500MB int main(void) { unsigned long int i; unsigned char *data; data = (unsigned char *)malloc(SIZE); if(data == NULL) { printf("メモリが確保できません\n"); exit(EXIT_FAILURE); } int fd; fd = open( "filein.dat" ); read( fd, data, sizeof(unsigned char)*SIZE); close(fd); /* //表示 for( i=0; i<SIZE; i++ ){ printf("%2x", data[i]); } puts(""); */ FILE *fp; fp = fopen("fileout.dat", "w"); fwrite( data, sizeof( unsigned char), (int)SIZE, fp); fclose(fp); free(data); return 0; }

  • C言語のファイル読み込み

    あるcsvファイルがあり、それは以下のように(規則性のない)波形のデータです。 0.001 0.14 0.002 0.32 0.003 0.46 ・ ・ 2.000 0.22 左側がx軸、右側がy軸で、データはそれぞれ2000個あります。 このデータ(波形)をC言語のプログラムに読み込ませるにはどうしたらいいのでしょうか? #include <stdio.h> int main(void) { double i,j; FILE *file; file = fopen("sample.csv","r"); fscanf(file,"%ls,%ls",&i,&j); fclose(file); printf("i = %d : j = %d\n",i,j); return 0; } とすれば最初の1行目だけは読めますが、それ以降がわかりません。 配列を使えばいいのでしょうか?

  • C言語でクロマキー合成をする方法

    input.bmpとbackground.bmpとoutput.bmpを作りで好きな絵を用意して、input.bmpというビットマップファイル(色数は24ビット)とbackground.bmpというファイルを開き,クロマキー合成をし,ビットマップファイルoutput.bmpに出力させる。 上記の物をC言語でするにはどうすればいいのでしょうか? 下記のものは自分でやったのですがやり方が分かりません。どなたか知恵を貸してください。 (ほとんど間違っていると思いますが・・・) #include<stdio.h> int main() { FILE *fp; int i; char data[2]; short s; fp1=fopen("input.bmp","rb"); fp2=fopen("background.bmp","rb"); fp3=fopen("output.bmp","wb") int k; for(k=0;k<10000;k++){ fputc(0,fp); fputc(0,fp); fputc(0,fp); } fclose(fp); fread(&data[0],1,2,fp1); fread(&data[0],1,2,fp2); fwrite(&data[0],1,2,fp3); int fs; fread(&fs,f1); fread(&fs,f2); fwrite(&fs,f3); fp=fopen("aka.bmp","wb"); fread(moji,1,2,fp); i=30054; fread(&i,4,1,fp); i=0; fread(&i,4,1,fp); i=54; fread(&i,4,1,fp); i=40; fread(&i,4,1,fp); i=100; fread(&i,4,1,fp); i=100; fread(&i,4,1,fp); s=1; fread(&s,2,1,fp); s=24; fread(&s,2,1,fp); i=0; fread(&i,4,1,fp); i=30000; fread(&i,4,1,fp); i=120; fread(&i,4,1,fp); i=120; fread(&i,4,1,fp); i=0; fread(&i,4,1,fp); i=0; fread(&i,4,1,fp); for(k=0;k<10000;k++){ fputc(0,fp); fputc(0,fp); fputc(70,fp); } fclose(fp); fp=fopen("midori.bmp","wb"); fread(moji,1,2,fp); i=30054; fread(&i,4,1,fp); i=0; fread(&i,4,1,fp); i=54; fread(&i,4,1,fp); i=40; fread(&i,4,1,fp); i=100; fread(&i,4,1,fp); i=100; fread(&i,4,1,fp); s=1; fread(&s,2,1,fp); s=24; fread(&s,2,1,fp); i=0; fread(&i,4,1,fp); i=30000; fread(&i,4,1,fp); i=120; fread(&i,4,1,fp); i=120; fread(&i,4,1,fp); i=0; fread(&i,4,1,fp); i=0; fread(&i,4,1,fp); for(k=0;k<10000;k++){ fputc(0,fp); fputc(150,fp); fputc(0,fp); } fclose(fp); fp=fopen("ao.bmp","wb"); fread(moji,1,2,fp); i=30054; fread(&i,4,1,fp); i=0; fread(&i,4,1,fp); i=54; fread(&i,4,1,fp); i=40; fread(&i,4,1,fp); i=100; fread(&i,4,1,fp); i=100; fread(&i,4,1,fp); s=1; fread(&s,2,1,fp); s=24; fread(&s,2,1,fp); i=0; fread(&i,4,1,fp); i=30000; fread(&i,4,1,fp); i=120; fread(&i,4,1,fp); i=120; fread(&i,4,1,fp); i=0; fread(&i,4,1,fp); i=0; fread(&i,4,1,fp); for(k=0;k<10000;k++){ fputc(255,fp); fputc(0,fp); fputc(0,fp); } fclose(fp); return(0); }

  • ファイルの読み書きについて教えてください。

    フォームから投稿されてきた内容を、テキストファイルに書き込むphpを作っているのですが、 flock関数で、誰かが書き込んでいるときに他の人が書き込めないようにファイルをロックしたいと思っています。 以下のソースでLOCK_EXとLOCK_UNは正しく動作するでしょうか。 いまいち不安で困っています。 //ポストされてきた内容が$nameに入ります $name = $_POST['name']; $fh=fopen("test.txt","a+"); flock($fh, LOCK_EX); fwrite($fh,"$name \n"); flock($fh, LOCK_UN); fclose($fh); どなたか詳しい方教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • C言語でファイルから読み込みができません。

    以下のプログラムを実行すると よくわからない値が返ってきます。 なぜでしょうか?教えてください。 #include <stdio.h> void main () { FILE *fp; double a, b; int count=0; fp = fopen("test.xls", "r"); while(1) { fscanf(fp, "%lf %lf\n", &a, &b); printf("%f, %f\n", a, b); count++; if(count==10)break; } fclose(fp); } test.xlsの中身は 1.0 2.0 3.0 4.0 5.0 6.0   :   :   :   : です。 よろしくお願いします。

  • ビットマップファイル生成(C言語)

    64個の整数(ピクセルの色データ)をファイルin.txtから読み込み、8×8のサイズのビットマップファイルout.bmpを生成するプログラムを作っていますが、なんだか良くわかりません。 64個の整数をすべて256にすれば青になると言われたのですが、黒になってしまいます。 一応ビルドと実行はできました。 自分で作ったソースは↓です http://www.geocities.jp/c_prog2011/file_2.txt 一応問題文は↓です http://www.geocities.jp/c_prog2011/bitmap_1.txt よろしくおねがいします。

  • プログラミングの課題です。

    input.bmpというビットマップファイル(色数は24ビット)とbackground.bmpというファイルを開き,クロマキー合成をし,ビットマップファイルoutput.bmpに出力させる。ただしimput.bmpが、青:100以上 緑:150以下 赤:70以下なら背景とみなしてよい。 #include <stdio.h> int main() { FILE *fp1,*fp2,*fp3; char pixeldata[54]; int width,height; int i,j; fp1=fopen("input.bmp","rb"); if(fp1==NULL) return(1); //fp1のヘッダー情報の読み込み fp2=fopen("background.bmp","rb"); if(fp2==NULL) return(1); //fp2のヘッダー情報の読み込み fp3=fopen("output.bmp","wb"); if(fp3==NULL) return(1); //fp3のヘッダー情報の書き込み fread(pixeldata,1,54,fp1); fread(pixeldata,1,54,fp2); fwrite(pixeldata,1,54,fp3); printf("input.bmpの縦は何ピクセルですか?"); scanf("%d",&height); printf("input.bmpの横は何ピクセルですか?"); scanf("%d",&width); for(i=0;i<height*width*3;i++){ //画素情報の読み込み(画像サイズ分繰返し) fgetc(fp1); //1画素分のRGBの情報をfp1から読み込み fgetc(fp2); //1画素分のRGBの情報をfp2から読み込み if(){ //fp1から読み込んだ画素が青い fputc(,fp3); //fp3へfp2で読み込んだ1画素分の情報を書き込み } else{//fp1から読み込んだ画素が青くない fputc(,fp3); //fp3へfp1で読み込んだ1画素分の情報を書き込み } } fclose(fp1);fclose(fp2);fclose(fp3); return(0); } みたいな感じで作りましたが、後半がどうやったらいいかわかりません。 どうしたらいいかアドバイスや解説お願いします。

  • C言語

    ファイルデータ(11,22,33,0,44)を読み込んで表示することを5回繰り返すプログラムを作りたいのですが分かりません。 さらに出来ればファイルデータが0でなければ表示し、0を読み込んだら終了するwhile文でのプログラムも教えてください。 途中経過 #include <stdlib.h> #include <stdio.h> int main(void) { int x = 0,i; FILE *infile; infile = fopen ("test.txt", "r"); if(infile == NULL) { fprintf(stderr, "test.txtが開けません\n"); exit(1); } i = 0 while(1){ i++; fscanf(infile, "%d", &x); printf("%d\n", x); if(i = 5)break; } fclose(infile); return 0; } ここまでで実行すると11しか表示されません。 これまでの質問分かるかたどなたか教えてくださいお願いします。