• ベストアンサー

プログラムをやっているのですが・・・・・

C言語についての質問です。 画像の左半分を黒くした画像を生成したいのですが・・・・・・・ /*printfとscanfを使用するためにインクルードする*/ #include<stdio.h> /*ビットマップ画像を扱うためのヘッダ*/ #include<Dll_BMP_C.h> //画像ファイル名最大長(バイト) #define NAME_SIZE 101 int main(void) { int j,k; /* nWidth:画像の幅、nHeight:画像の高さ、nVal:輝度値*/ int nWidth,nHeight; /*pcFileName:画像ファイル名を保存する配列*/ char pcFileName[NAME_SIZE]; /*pBmpOrig:読み込んだ画像へのポインタ pBmpCopy:複製した画像へのポインタ*/ DllBmp*pBmpOrig,*pBmpCopy; /*読み込む画像のファイル名を指定する*/ printf(“読み込む画像”); scanf(“%s”,pcFileName); /*画像を読み込みメモリに保存する 読み込みに失敗したら実行を中止する*/ pBmpOrig=DllBmpReadImage(pcFileName); if(pBmpOrig==NULL) { printf(“画像の読み込みに失敗! 実行を中止します\n”); exit(1); } /*読み込んだ画像のヘッダ情報を表示する*/ DllBmpShowHeader(pBmpOrig); /*読み込んだ画像の大きさを得る*/ nWidth=DllBmpGetWidth(pBmpOrig); nHeight= DllBmpGetHeight (pBmpOrig); /* 画像を生成する */ for(j = 0; j < nHeight; j++) for(k = 0; k < nWidth; k++) { DllBmpSetPixelValueR(pBmpOrig, j, k, 255); DllBmpSetPixelValueG(pBmpOrig, j, k, 255); DllBmpSetPixelValueB(pBmpOrig, j, k, 255); } /*保存する画像のファイル名を指定する*/ printf(“保存する画像”); scanf(“%s”,pcFileName); /*画像を保存する 保存に失敗したら実行を中止する*/ if(!DllBmpWriteImage(pcFileName,pBmpOrig)); { printf(“画像の保存に失敗! 実行に中止します”); exit(1); } /*画像をメモリから消去する*/ DllBmpDleteImage(pBmpOrig); return 0; } 画像の輝度値を操作するプログラムをやっているのですが、画像の左半分を黒くした画像を生成する場合は、 DllBmpSetPixelValueR(pBmpOrig, j, k, 255); DllBmpSetPixelValueG(pBmpOrig, j, k, 255); DllBmpSetPixelValueB(pBmpOrig, j, k, 255); の部分のRが赤、Gが緑、Bが青なんですが、その値をすべて0にすればいいんでしょうか?もしくはあらたに定義したり、条件式を作るべきなのでしょうか?? 左半分を変色したい場合はnWidth/2と変えれば大丈夫だと思います。 すみませんがお願いします。 わかる方は、教えてください。よろしくお願いします。

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

ここ数日、ずいぶんと連続で質問されているようですが… どこかの課題か何かですか? > /*ビットマップ画像を扱うためのヘッダ*/ > #include<Dll_BMP_C.h> 中身が不明ではどうしようもないの思いませんか? >画像の輝度値を操作するプログラムをやっているのですが、画像の左半分を黒くした画像を生成する場合は、 >DllBmpSetPixelValueR(pBmpOrig, j, k, 255); >DllBmpSetPixelValueG(pBmpOrig, j, k, 255); >DllBmpSetPixelValueB(pBmpOrig, j, k, 255); >の部分のRが赤、Gが緑、Bが青なんですが、その値をすべて0にすればいいんでしょうか?もしくはあらたに定義したり、条件式を作るべきなのでしょうか?? >左半分を変色したい場合はnWidth/2と変えれば大丈夫だと思います。 それで、やってみた結果はどうだったのでしょう? 期待する結果でしたか? 期待と違った場合はどのようになりましたか? 上記のヘッダの中身も、付随するかもしれないライブラリもない人が、正しく動作するプログラムを書ける。 と本気でお思いですか?

fantazical
質問者

お礼

プログラムの問題集みたいなのをやっているのですが・・・・・・・・・・やっぱり苦手で。。。。。。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

noname#62605
noname#62605
回答No.3

いくつかfantazicalさんの質問を拝見させていただきました。 多分学校の課題かなにかだと思いますが…。 プログラムを作る前に紙に書いてイメージをつかむのはとても重要ですし、いい心がけだと思います。 「何をしたい(する)」→「どうすべきか」という考えをまとめなければプログラミングに取り掛かっても自分が予想していなかったエラーやバグが出てくるかもしれません。 プログラミングはあくまでも手段です。 やり方ももしかしたら他の人と違うやり方かもしれません。 ex)左半分を黒く塗りつぶす。 →一度画像を全部メモリに展開してから左半分に相当する部分を黒くする。 →左半分に相当するアドレスには黒くする処理を入れ、右半分に相当するアドレスにはその色を入れる →サイズを取得し、まず全てを黒くしてから改めて右半分に相当する部分を上書き など…。 今出ているプログラムを拝見するに(ライブラリの中身が分からない(=仕様が分からないとコメントできない)ですが)、元の画像ファイルは壊れないと思いますのでいろいろ試してみてはいかがですか? 不要なアドレス参照を(NULLを参照してしまったら)エラーでexitしているので怖がらないで動かしてみるといいです。マシンは壊れないので安心してください。 初めは、画像ファイルをメモリに展開して(ココでいう画像生成をして)画像ファイルを別名で保存するという基本的なものを作って実際に動くか確認してから、途中の過程に「輝度を調整する」とか「半分の画像を黒く塗りつぶす」という機能を追加していけばいいと思います。 ライブラリがあれば仕様を理解したうえで使ってもいいでしょうし、なければ自分で処理を作る必要もあるでしょうし。 とりあえず柱が出来上がらないとどこがどうおかしいのかも見えにくくなってしまうので、プログラミングだけに焦点を当てるのではなく、規模は小さいかもしれないけどシステム開発をしているのだと思ってやってみてください。

fantazical
質問者

お礼

意見をありがとうございます。 学校の課題ではないのですが、やっぱりプログラムが苦手なので・・・・・・・。。。。。。。

全文を見る
すると、全ての回答が全文表示されます。
  • tokichim
  • ベストアンサー率42% (88/205)
回答No.2

ライブラリの中身は分かりませんが。 DllBmpSetPixelValueR/G/B()の関数の使い方を調べればおのずとわかると思います。 推測ですが、たぶん原点から指定の大きさの領域を指定色で塗りつぶす、という関数だと思うので、最初に全領域を白で塗りつぶしてから、半分を黒で塗りつぶせばよいでしょう。 第四引数が白は全部255,黒は全部0でしょう、たぶん。 半分の指定の仕方はたぶん思っているとおりでしょう。 #できればやってみてから質問して欲しい… 答えを教えてもらって最初からいい点数を取っても意味なしです。後々苦労します。こういうことは失敗や試行錯誤から学ぶことに意味があるのですから。

fantazical
質問者

お礼

助かります。 自分もいろいろやっているのですが、とても参考になります。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 画像の輝度値のプログラムについて・・・・・・

    プログラムをPCでやる前にある程度、何かに書いてからやっているのですが、画像の1部分の色を変えたいのですが、例えば画像の左半分を黒くした画像を生成したい場合は,(一般的には,輝度値は0~255までの整数(8ビット)か,または0~65535までの整数(16ビット)により表される) *printfとscanfを使用するためにインクルードする*/ #include<stdio.h> /*ビットマップ画像を扱うためのヘッダ*/ #include<Dll_BMP_C.h> //画像ファイル名最大長(バイト) #define NAME_SIZE 101 int main(void) { int j,k; /* nWidth:画像の幅、nHeight:画像の高さ、nVal:輝度値*/ int nWidth,nHeight; /*pcFileName:画像ファイル名を保存する配列*/ char pcFileName[NAME_SIZE]; /*pBmpOrig:読み込んだ画像へのポインタ pBmpCopy:複製した画像へのポインタ*/ DllBmp*pBmpOrig,*pBmpCopy; /*読み込む画像のファイル名を指定する*/ printf(“読み込む画像”); scanf(“%s”,pcFileName); /*画像を読み込みメモリに保存する 読み込みに失敗したら実行を中止する*/ pBmpOrig=DllBmpReadImage(pcFileName); if(pBmpOrig==NULL) { printf(“画像の読み込みに失敗! 実行を中止します\n”); exit(1); } /*読み込んだ画像のヘッダ情報を表示する*/ DllBmpShowHeader(pBmpOrig); /*読み込んだ画像の大きさを得る*/ nWidth=DllBmpGetWidth(pBmpOrig); nHeight= DllBmpGetHeight (pBmpOrig); /* 画像を生成する */  for(j = 0; j < nHeight; j++)   for(k = 0; k < nWidth; k++)    {     DllBmpSetPixelValueR(pBmpOrig, j, k, 255);     DllBmpSetPixelValueG(pBmpOrig, j, k, 255);     DllBmpSetPixelValueB(pBmpOrig, j, k, 255);    } /*保存する画像のファイル名を指定する*/ printf(“保存する画像”); scanf(“%s”,pcFileName); /*画像を保存する 保存に失敗したら実行を中止する*/ if(!DllBmpWriteImage(pcFileName,pBmpOrig)); { printf(“画像の保存に失敗! 実行に中止します”); exit(1); } /*画像をメモリから消去する*/ DllBmpDleteImage(pBmpOrig); return 0; } 画像の輝度値を操作するプログラムをやっているのですが、画像の左半分を黒くした画像を生成する場合は、 DllBmpSetPixelValueR(pBmpOrig, j, k, 255); DllBmpSetPixelValueG(pBmpOrig, j, k, 255); DllBmpSetPixelValueB(pBmpOrig, j, k, 255); の部分のRが赤、Gが緑、Bが青なんですが、その値をすべて0にすればいいんでしょうか?もしくはあらたに条件式を作るべきなのでしょうか??そして画像の左半分を黒くしたい場合は、 for(j = 0; j < nHeight; j++)   for(k = 0; k < nWidth; k++) の部分のj < nHeightをj < nHeight/2にしたらなるでしょうか?? この場合だと上半分になってしまうでしょうか?? PCがまだ使えないのでルーズリーフにいろいろ試行錯誤して書いてるのですが、他に何かヒントがあればよろしくお願いします。。。。。 すみませんがお願いします。

  • プログラムを紙に書いていろいろやっているのですがで分からないところがあります・・・・・・・・・・・・・・

    /*printfとscanfを使用するためにインクルードする*/ #include<stdio.h> /*ビットマップ画像を扱うためのヘッダ*/ #include<Dll_BMP_C.h> //画像ファイル名最大長(バイト) #define NAME_SIZE 101 int main(void) { int j,k; /* nWidth:画像の幅、nHeight:画像の高さ、nVal:輝度値*/ int nWidth,nHeight; /*pcFileName:画像ファイル名を保存する配列*/ char pcFileName[NAME_SIZE]; /*pBmpOrig:読み込んだ画像へのポインタ pBmpCopy:複製した画像へのポインタ*/ DllBmp*pBmpOrig,*pBmpCopy; /*読み込む画像のファイル名を指定する*/ printf(“読み込む画像”); scanf(“%s”,pcFileName); /*画像を読み込みメモリに保存する 読み込みに失敗したら実行を中止する*/ pBmpOrig=DllBmpReadImage(pcFileName); if(pBmpOrig==NULL) { printf(“画像の読み込みに失敗! 実行を中止します\n”); exit(1); } /*読み込んだ画像のヘッダ情報を表示する*/ DllBmpShowHeader(pBmpOrig); /*読み込んだ画像の大きさを得る*/ nWidth=DllBmpGetWidth(pBmpOrig); nHeight= DllBmpGetHeight (pBmpOrig); /* x座標とy座標の値を足すと奇数になるすべてのピクセルを白(RGB成分の輝度値が255)にする画像を生成する */  for(j = 0; j < nHeight; j++)   for(k = 0; k < nWidth; k++)   if(j+k%2==1)     {     DllBmpSetPixelValueR(pBmpOrig, j, k, 255);     DllBmpSetPixelValueG(pBmpOrig, j, k, 255);     DllBmpSetPixelValueB(pBmpOrig, j, k, 255);    } /*保存する画像のファイル名を指定する*/ printf(“保存する画像”); scanf(“%s”,pcFileName); /*画像を保存する 保存に失敗したら実行を中止する*/ if(!DllBmpWriteImage(pcFileName,pBmpOrig)); { printf(“画像の保存に失敗! 実行に中止します”); exit(1); } /*画像をメモリから消去する*/ DllBmpDleteImage(pBmpOrig); return 0; } 画像の輝度値を操作するプログラムをやっているのですが、x座標とy座標の値を足すと奇数になるすべてのピクセルを白(RGB成分の輝度値が255)にする画像を生成したいのですが、こんな感じで作ってみたんですが、条件式はif(j+k%2==1) で作ってみたんですが、これだとj+kよりk%2の方がやっぱり先に行いますでしょうか??他に何かいい奇数の判断ってあるでしょうか??ルーズリーフにいろいろ試行錯誤して書いてるのですが、他に何かヒントがあればよろしくお願いします。。。。。 すみませんがお願いします。

  • プログラミングでの画像の生成について・・・・・・・・

    任意の画像をfと呼び,座標(x,y)における画像fの輝度値を(R(x,y),G(x,y),B(x,y))と呼ぶことにします。 以下の処理を行うプログラムを作成してください。 1,画像fの明るさがm分の1になった画像h1(x,y)=(R(x,y)/m,G(x,y)/m,B(x,y)/m)を生成する。 ここで,mは0<m<10の範囲にある任意の整数である. 2,画像fから法256の画像h2(x,y)=((n×R(x,y))mod(256),(n×G(x,y))mod(256),(n×B(x,y))mod(256))を生成する。 ここで,nは任意の正の整数である. *printfとscanfを使用するためにインクルードする*/ #include<stdio.h> /*ビットマップ画像を扱うためのヘッダ*/ #include<Dll_BMP_C.h> //画像ファイル名最大長(バイト) #define NAME_SIZE 101 int main(void) { int j,k; /* nWidth:画像の幅、nHeight:画像の高さ、nVal:輝度値*/ int nWidth,nHeight; /*pcFileName:画像ファイル名を保存する配列*/ char pcFileName[NAME_SIZE]; /*pBmpOrig:読み込んだ画像へのポインタ pBmpCopy:複製した画像へのポインタ*/ DllBmp*pBmpOrig,*pBmpCopy; /*読み込む画像のファイル名を指定する*/ printf(“読み込む画像”); scanf(“%s”,pcFileName); /*画像を読み込みメモリに保存する 読み込みに失敗したら実行を中止する*/ pBmpOrig=DllBmpReadImage(pcFileName); if(pBmpOrig==NULL) { printf(“画像の読み込みに失敗! 実行を中止します\n”); exit(1); } /*読み込んだ画像のヘッダ情報を表示する*/ DllBmpShowHeader(pBmpOrig); /*読み込んだ画像の大きさを得る*/ nWidth=DllBmpGetWidth(pBmpOrig); nHeight= DllBmpGetHeight (pBmpOrig); /* 画像を生成する */ for(j = 0; j < nHeight; j++) for(k = 0; k < nWidth; k++) { DllBmpSetPixelValueR(pBmpOrig, j, k, 255); DllBmpSetPixelValueG(pBmpOrig, j, k, 255); DllBmpSetPixelValueB(pBmpOrig, j, k, 255); } /*保存する画像のファイル名を指定する*/ printf(“保存する画像”); scanf(“%s”,pcFileName); /*画像を保存する 保存に失敗したら実行を中止する*/ if(!DllBmpWriteImage(pcFileName,pBmpOrig)); { printf(“画像の保存に失敗! 実行に中止します”); exit(1); } /*画像をメモリから消去する*/ DllBmpDleteImage(pBmpOrig); return 0; } 剰余は%演算子を使って求めることができると思うのですが・・・。。 処理内容を選択できて、mとnの値を指定できるように作りたいのですが・・・・・ 何かアドバイス的なものをすみませんがよろしくお願いします。

  • 条件式について・・・・・・・・・・・・

    画像の左下隅と右上隅を結んだ線分を考え、この線分よりも下の三角形の領域をネズミ色(RGB成分の輝度値が128)にした画像を生成するプログラムをやっているのですが、左下隅と右上隅を結んだ線分を考え、この線分よりも下の三角形の領域の色を変えたい場合は、 まず、for(k = 0; k < nWidth; k++) を変えるべきだと思うのですが・・・・・・・四角の画像の右下から上に徐々に色を変えてくかんじだと思うのですが、三角形の公式みたいなのって関係ありますか? /* nWidth:画像の幅、nHeight:画像の高さ、nVal:輝度値*/ int nWidth,nHeight; /* 画像を生成する */ for(j = 0; j < nHeight; j++) for(k = 0; k < nWidth; k++) { DllBmpSetPixelValueR(pBmpOrig, j, k, 255); DllBmpSetPixelValueG(pBmpOrig, j, k, 255); DllBmpSetPixelValueB(pBmpOrig, j, k, 255); } わかる方は、教えてください。よろしくお願いします。

  • グレースケール画像を量子化する問題で、量子化レベル数を8階調(N=8)

    グレースケール画像を量子化する問題で、量子化レベル数を8階調(N=8)と設定して画像h=(Ih,Ih,Ih)を生成し、その輝度ヒストグラムを生成せよという問題なのですが。 printf("量子レベル数Nを入力してください"); scanf("%d",&n); dn=256/n; for(j=0;j<nHeight;j++) for(k=0;k<nWidth;k++){ rVal=DllBmpGetPixelValueR(pBmpOrig, j, k); for(i=0;i<n;i++){ if(dn*i<=rVal&&dn*(i+1)>rVal){ f1=dn*i; } DllBmpSetPixelValueR(pBmpCopy1, j, k, f1); DllBmpSetPixelValueG(pBmpCopy1, j, k, f1); DllBmpSetPixelValueB(pBmpCopy1, j, k, f1); ※nHeight:高さ nWidth:幅 rVal=DllBmpGetPixelValueR(pBmpOrig, j, k):赤色成分の輝度値を得る 量子化の公式ΔN=256/N I(x,y)=n*ΔN ifn*ΔN≦I(x,y)<(n+1)*ΔN for∀n={0,N-1} をif文以下で表現しました。 ここまでやってみましたがあとがよくわかりません。 教えてください。 どうかよろしくお願いします。

  • 奇数の判断について・・・・・・・・

    y座標が16で割ると余り1になるようなすべてのピクセルを白(RGB成分の輝度値が255)にした画像を生成したい場合・・・・・・・・・ /* nWidth:画像の幅、nHeight:画像の高さ*/ /* x座標とy座標の値を足すと奇数になるすべてのピクセルを白(RGB成分の輝度値が255)にする画像を生成する */  for(j = 0; j < nHeight; j++)   for(k = 0; k < nWidth; k++)   if(k%16==1)     {     DllBmpSetPixelValueR(pBmpOrig, j, k, 255);     DllBmpSetPixelValueG(pBmpOrig, j, k, 255);     DllBmpSetPixelValueB(pBmpOrig, j, k, 255);    } と条件式としましては、if(k%16==1)な感じでも大丈夫でしょうか? すみませんがアドバイスお願いします。。。。。。

  • 昇順に並べ替えるプログラム(続き)

    (C言語)実行例のような3つの整数を読み込み昇順に並べ替えるプログラムは途中までわかったのですがあとはどう修正・追加をすればいいのでしょうか? 実行例 1:45 2:43 3:38 昇順に並べ替えました。 1:38 2:43 3:45 途中までのプログラム #include<stdio.h> int main(void) { int n1,n2,n3; printf("1:"); scanf("%d",&n1); printf("2:"); scanf("%d",&n2); printf("3:"); scanf("%d",&n3); printf("昇順に並べ替えました。\n"); return 0; }

  • プログラムに詳しい方教えてください!

    #include<stdio.h> void fxl(int x,int y); int main(void) { int a,b,m,n; printf("整数aの値を入力\n"); scanf("%d",&b); printf("整数bの値を入力\n"); scanf("%d",&b); m=a; n=b; fxl(m,n); printf("a=%dとb=%dを加算した値は%d\n",ab,m); printf("a=%dからb=%dを減算した値は%d\n",ab,n); return 0; } void fxl(int x,int y) { int j,k; j=x; k=y; x=j+k; y=j-k; } このプログラムを作ってみたのはいいのですが、参照渡しを使って正常に足し算、引き算をするにはどうすればよいのでしょうか。

  • ピラミッド表示プログラム。

    ピラミッドを表示させるプログラムを考えています。 例えば3段の場合   *  *** ***** っというような表示です。 #include <stdio.h> void spira(int n); main() { int a; printf("段数は:"); scanf("%d",&a); spira(a); } void spira(int n) { int i,j=1,a,b,k; for(a=n;a>0;a--){ for(b=a-1;b<=n;b--){ printf(" "); } k=(j-1)*2+1; for(i=1;i<=k;i++){ printf("*"); } j++; printf("\n"); } } このように考えてみたのですが、無限ループになって表示できません。 どこが悪いでしょうか? 無限ループの原因はどうやったら解消されるでしょうか?

  • ネイピア数(e)のプログラム

    テイラー展開によってネイピア数の近似値を求める プログラミングが全くわかりません。 e = 2.71828 18284 59045 23536 02874 71352 … を計算したいのですが。 #include <stdio.h> #include <math.h> int kaijou(int p) { int cnt; int val=1; for(cnt=1 ; cnt<=p ; cnt++){ val=val*cnt; } return(val); } double napier(int p) { printf("eを計算します。E = (1+(1/k))^k\n"); printf("k=いくつまで計算しますか ?\n"); scanf("%d", &n); double E[n]; E[1] = 1; for (j = 1; j <= n; j++){ E[j] = E[j] + 1; } for (k = 1; k <= n; k++) { K = K + 1; A = 1 / K; // printf("A = %e, ",A); B = 1 + A; // printf("B = %e\n",B); for ( i = 1; i<=k; i++){ E[k] = E[k] * B; // printf("E[%3d]= %e\n",k,E[k]); } void main(void) { int n; int cnt; double answer; printf("計算する最大の項nを入力してください:"); scanf("%d",&n); for(cnt=1 ; cnt<=n ; cnt++){ answer=napier(cnt); printf("第%d項までの近似値:%f 真値:%f 差:%f\n",cnt,answer,exp(1),answer-exp(1)); } }