- ベストアンサー
画像の取り込みについてですが
プログラミングの初心者ですが、現在VC++2005でプログラムについて勉強しています。画像の取り込みを行うところで、わからなくなってしまったので、みなさんのご指導お願いいたします。 今、行いたいのは あるフォルダAの中に100枚の画像の中の何枚かに対し連続的に処理することです。この100枚の画像の名前は1から100までの番号です。例えば、50枚目から70枚目の20枚の画像に対して、二値化を行って、結果を保存したいです。保存する時の画像名前は元の番号に100を足して、(例:50+100=150)そうすると、元は何番なのかがわかります。 ここで、この50番から連続の20枚の画像をfor文で実現しようとしています。しかしながら、連続に取り込む方法がよくわからなくて困っています。 Bitmap^ bmap=gcnew Bitmap("C¥A"); ここでフォルダを指定します。 for(n=0;n<=20;n++){ ここから20枚の画像を処理する /ここで一番最初の50番の画像を取り込みます/(やり方がわからないです) /二値化処理をします/ /保存します(保存の仕方がわからないです)/ /取り込んだ50番をn足して次の51番になります(やり方がわからないです)。for文に戻り、続けて処理を行う/ } もしかして根本的な考え方も間違っているかもしれませんが、ご指導をいただければ感謝致します。 どうぞよろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 int fileNo = 50+n; として、 fileNo.ToString() + ".bmp" とすれば簡単に文字列に出来ます。 取り敢えず、アラもあるとは思いますが、以下参考程度に。 //グレースケール private: int ToGray(int R, int G, int B) { const int Y = 0.299 * R + 0.587 * G + 0.114 * B; return Y; } //2値化画像を作成する private: Bitmap^ CreateBinaryImage(Bitmap^ bmp) { Bitmap^ bmpGray = dynamic_cast<Bitmap^>(bmp->Clone()); for(int y = 0; y < bmp->Height; ++y) { for(int x = 0; x < bmp->Width; ++x) { Color color = bmp->GetPixel(x, y); //グレイスケールの計算 const int Y = this->ToGray(color.R, color.G, color.B); //127より大きければ白色を出力する const int Binary = Y > 127 ? 255 : 0; bmpGray->SetPixel(x, y, Color::FromArgb(Binary, Binary, Binary)); } } return bmpGray; } //50~70のイメージを探し出して、2値化してからセーブする private: System::Void SaveMyImage() { //画像の有るフォルダ名 String^ sFolder = gcnew String("c:\\a"); //回す for(int i = 0; i < 20; ++i) { const int fileNo = 50 + i; try { //ファイルへのフルパスを作成する String^ sPath = sFolder + "\\" + fileNo.ToString() + ".bmp"; //読み込む Bitmap^ bitmap = dynamic_cast<Bitmap^>(Bitmap::FromFile(sPath)); //2値化した画像を受け取る Bitmap^ bmpBin = this->CreateBinaryImage(bitmap); //例えば2値化画像には"_bin"を付属してセーブする sPath = sFolder + "\\" + fileNo.ToString() + "_bin.bmp"; //実際にセーブ bmpBin->Save(sPath); } catch(System::Exception^) { //ファイルが無かった } } }
その他の回答 (2)
- bkbkb
- ベストアンサー率33% (97/289)
補足です。 保存するときも同様です。 n+100にした数字を文字列に変換して、.jpgを連結してファイル名を作ります。 そのファイル名を使って処理を終えた画像を保存してください。
- bkbkb
- ベストアンサー率33% (97/289)
そのロジックでいくなら ファイル名を文字列で作ればいいんです。 変数nを文字に変換して.jpgと連結して1.jpgのような文字列を作ります。 その文字列をファイル名として使って画像を開けば良いんです。 一連の処理を終えたら、画像ファイルを閉じて、次のループでまたg像ファイルを開きます。
お礼
bkbkbさんへ 補足説明をしていただいてどうもありがとうございます。 とても勉強になりました。結果出せるようにがんばります。
お礼
machongolaさんへ ご丁寧に指導していただき、どうもありがとうございます。 教えて頂いたものをさっそく組んでみたいと思います。 また、結果が出たらご報告致します。