• ベストアンサー

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); }

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

  • ベストアンサー
  • usatan2
  • ベストアンサー率37% (163/436)
回答No.3

No2です。 応答がないので、追加回答です。 >下記のものは自分でやったのですがやり方が分かりません。どなたか知恵を貸してください。 1画素あたりの色データを定義して、 1画素のデータを読み込む関数 bool getRGB(color24 *c, FILE *fp)、 書き出す関数 void putRGB(color24 c, FILE *fp)、 クロマキー処理として背景画像を使うかどうかを判断する関数 bool transparency(color24 c), を作ればいいのでは? 具体的には、以下にプログラムの骨子を書きましたので参考にしてください。 このプログラムの肝は、最後の関数transparency()です。 単純には24ビットのすべての色について、背景画像を使うのか使わないのかを書いたテーブルを用意して判断するのが完璧ですが、24ビットの表、つまり16,000,000色分の表を用意する必要があり現実的ではありません。ここは質問者さんの腕の見せ所ですが、単純に、RGBの各成分の値の大小で判断すると、思ったような結果が得られませんよ(経験者談)。 もし回答者が作るとしたら、24ビットの色を256色程度に分類して、  背景画像を使う色--値:0  背景画像は使わない色--値:1  どちらともいえない色--値:より詳細なレベルの表の番号 といったテーブルをつくり、多段階で判断すると思います。 /* 24bit カラーの型を定義 */ struct color24 { BYTE r,g,b; } forground, background; void main() { FILE *fpfg,*fpbg,*fpout; /* ファイルをオープンして */ fpfg = fopen("input.bmp","rb"); fpbg = fopen("background.bmp","rb"); fpout= fopen("output.bmp","wb") /* 画素が正常に読み込める間、つまりすべての画素についてクロマキー処理をして */ while( getRGB(&forground,fpfg) && getRGB(&background,fpbg) ) {   if(transparency(forground)) putRGB(background,fpout);   else putRGB(forground, fpout); } /* ファイルをクローズしてプログラムを終了する */ fclose(fpfg); fclose(fpbg); fclose(fpout); }

bad-pc
質問者

お礼

ご回答ありがとうございました。参考にさせてもらいますね。

その他の回答 (2)

  • usatan2
  • ベストアンサー率37% (163/436)
回答No.2

回答になってなくてすいません。 コメントがないので、よくわかりませんので、コメントをつけてくださいね。 で早速ですが、8行目でfp1 に代入されてますが、fp1の型が定義されてませんので、ここでエラーになると思います。 #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") さらに次のブロックの部分も意味不明です。何をなさろうとしているのですか? コメント書きましょうよ。 変数fpは定義されてますが、値が代入されていないので、どこに書き出されるのか不明ですよね。 30000回0を、どこに書き出すつもりなのでしょう? int k; for(k=0;k<10000;k++){ fputc(0,fp); fputc(0,fp); fputc(0,fp); } fclose(fp); 以下同様、コメントをかかれていないと、何をなさろうとしているのか、少なくとも私には理解できませんし、他の回答者さんもわからないと思いますよ。

  • Kaone
  • ベストアンサー率60% (33/55)
回答No.1

そのビットマップは、24ビットの連続した色情報ファイルと思っていいのですか? もしWindows標準の24ビット画像ファイルだとすると、根本的に間違ってると思いますが・・・

bad-pc
質問者

お礼

24ビットの連続した色情報ファイルです。

関連するQ&A

専門家に質問してみよう