画像の連続取り込みができるプログラムを使いたいが、エラーが出る

このQ&Aのポイント
  • Visual Studio 2005のC++を使ってプログラムしている者です。
  • C#で画像の連続した取り込みができるプログラムを見つけて、C++でもできないかと思い、とりあえず"000.bmp"という画像を読み込めるプログラムを組んで見たのですがどうもうまくいきません。
  • Visual Studio の検索で以下のようにできましたが"'System::Object::ToString' : 関数に 1 個の引数を指定できません。"といったエラーがでてしまいます。ある程度近いところまでいっているとは思うのですが・・・どこが間違っているのかわかる方おりましたらよろしくお願いします。
回答を見る
  • ベストアンサー

画像の連続取り込み

Visual Studio 2005のC++を使ってプログラムしている者です。 C#で画像の連続した取り込みができるプログラムを見つけて、C++でもできないかと思い、とりあえず"000.bmp"という画像を読み込めるプログラムを組んで見たのですがどうもうまくいきません。 Visual Studio の検索で以下のようにできましたが"'System::Object::ToString' : 関数に 1 個の引数を指定できません。"といったエラーがでてしまいます。ある程度近いところまでいっているとは思うのですが・・・どこが間違っているのかわかる方おりましたらよろしくお願いします。 Object^ o = gcnew Object; o = (Object^)0; System::String^ filename = "C:/Documents and Settings/Owner/デスクトップ/"; //画像の場所ではなくファイルの場所(例:デスクトップ) filename += o->ToString("000") + ".bmp"; //ファイルの中の画像を指定 g = gcnew Bitmap(filename,true);

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

Object^ oじゃ無くて Int32^ oを使えば良いでしょう Int32^ o = gcnew Int32( 0 ); String filename = "ベースのパス" filename += o->ToString( "000\\.bmp" ); といった具合で ・・・

judas15
質問者

お礼

毎回ありがとうございます。 先日教えてもらったとおりやってみたらできました^^ かなり前の話になるのですが、このプログラムを使ってpictureBoxをデザインではなくプログラムのほうで作ってあげてそこにこの画像を表示させようとすると何も表示してくれません。エラーは起こっていないのでどこが間違っているのかわからないのですが、わかりますでしょうか?以下プログラムです。 int n = 0; picture[n] = gcnew PictureBox(); //pictureBox作成// picture[n]->Size = Drawing::Size( 100, 100 ); //pictureBoxのサイズ// picture[n]->Location = Drawing::Point( n*10,n*10); //pictureBoxの場所// picture[n]->Name = String::Format( L"pictures{0}", n ); //pictureBoxの名前// Int32^ o = gcnew Int32( 0 ); System::String^ filename = "ファイル場所"; filename += o->ToString("000") + ".bmp"; bmp[0] = gcnew Bitmap(filename,true); picture[n]->Image = bmp[0]; よろしくお願いします。。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

動的に生成したコントロールは そのコントロールの親のControlsコレクションなどへ追加しないとダメだと思います this->Controls->add( pictures[n] ); などを実行してみましょう

judas15
質問者

お礼

毎回お早い対応ありがとうございます^^ 今行ってみたところ表示されました。こういった処理が必要だったのですね。ありがとうございました。

関連するQ&A

  • Visual Studio 2005でWindowsフォームのプログラミングについて

    「Visual Studio 2005」のC++でWindowsフォームのプログラミングをしているのですが、画像保存ができなくて困ってます。 「開く」はどうにか参考書を見ながらできましたが、「保存」ができません。以下がプログラムとなっております。 private: System::Void 開くOToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {  OpenFileDialog^ myDLG = gcnew OpenFileDialog();  myDLG->AddExtension = true;  myDLG->DefaultExt = "bmp";  myDLG->FileName = "*.bmp";  myDLG->ShowReadOnly = false;  myDLG->Filter = "ビットマップ(*.bmp) | *.bmp | jpeg(*.jpg;*.jpeg) | *.jpg;*.jpeg";  if(myDLG->ShowDialog()==System::Windows::Forms::DialogResult::OK){    this->Text = myDLG->FileName;    pictureBox1->Image = gcnew Bitmap(myDLG->FileName);    Invalidate();  } } private: System::Void 保存SToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {  SaveFileDialog^ dlg = gcnew SaveFileDialog();  dlg->Filter = "ビットマップ(*.bmp) | *.bmp | jpeg(*.jpg;*.jpeg) | *.jpg;*.jpeg | すべてのファイル(*.*) | *.*";  if(dlg->ShowDialog() != System::Windows::Forms::DialogResult::OK){    return;  } /*** ここからわかりません。 ***/ } 知ってる方がいましたら教えてください。よろしくお願いします。

  • イメージボックスについて

    こんにちわ、Visual Studio 2005のC++を使ってプログラミングしているものです。イメージボックスについてお聞きしたいのですが、 private:array< PictureBox^>^ picture; int n = 0; int m = 0; int l = 0; for ( int n = 0; n < 4; n++ ) { if(n % 4 == 0){m = m + 60; l = 0;} /** 4つずつImageboxを表示 **/ picture[n] = gcnew PictureBox(); /** イメージボックス生成 **/ picture[n]->Size = Drawing::Size( 50, 50 );  /** イメージボックスのサイズ **/ picture[n]->SizeMode = System::Windows::Forms::PictureBoxSizeMode::StretchImage; picture[n]->Location = Drawing::Point( 10+50*l,10+m);  /** イメージボックスの位置座標 **/ picture[n]->Name = String::Format( L"pictures{0}", n );  /** イメージボックスの名前 **/ this->Controls->Add( picture[n] ); Int32^ o = gcnew Int32( 0 ); System::String^ filename = "C:/Documents and Settings/user/デスクトップ/画像/"; filename += o->ToString("000") + ".bmp";  /** フォルダ内の画像 **/ bmp[n] = gcnew Bitmap(filename,true);   picture[n]->Image = bmp[n];  /** イメージボックスnにイメージn表示 **/ l++; } といった感じで、とりあえず4つのイメージボックスを作ろうとしているのですがうまくいきません。画像ファイルの名前の足し方に問題があるのでしょうか@@; もしこのプログラムが通るようになったとしてもループ中に画像がなかったらエラーが起こってしまいますね。もし指定のフォルダを選んで、そのフォルダ内の画像を全て表示させるといったことはできないのでしょうか??それと今までデザイン時にピクチャボックスをダブルクリックすると、 private: System::Void pictureBox1_Click(System::Object^ sender, System::EventArgs^ e) {} といったクリック処理のための関数が現れるのですが、この場合はどう処理すればよいのでしょう? さらに言うとこれをパネルの上でやりたいのですが・・・ private: System::Void panel1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) { panel1->Controls->Add( picture[0] ); } とりあえずこれは置いといて、どうプログラムすればよいのか分かる方がいればご教授お願いします。

  • VC++フォームアプリケーション でのビットマップ処理

    私は今Visual Studio 2005(C++)のフォームアプリケーションでプログラムを組んでいるのですが、ビットマップ処理ができません。以下のプログラムにどのような変更を加えればできるようになるのでしょうか? ご存知の方がいたら教えてください。 #pragma once ~フォームのデザイン部分のプログラム(自動)なので省略いたします~ #pragma endregion private: Bitmap^ bmp; private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { } private: System::Void 開くOToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { OpenFileDialog^ myDLG = gcnew OpenFileDialog(); myDLG->AddExtension = true; myDLG->DefaultExt = "bmp"; myDLG->FileName = "*.bmp"; myDLG->ShowReadOnly = false; myDLG->Filter = "ビットマップ(*.bmp) | *.bmp | jpeg(*.jpg;*.jpeg) | *.jpg;*.jpeg"; if(myDLG->ShowDialog() == System::Windows::Forms::DialogResult::OK){ this->Text = myDLG->FileName; pictureBox1->Image = gcnew Bitmap(myDLG->FileName); Invalidate(); } } private: System::Void 保存SToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { SaveFileDialog^ myDLG = gcnew SaveFileDialog(); myDLG->AddExtension = true; myDLG->DefaultExt = "bmp"; myDLG->FileName = "*.bmp"; myDLG->Filter = "ビットマップ(*.bmp) | *.bmp | jpeg(*.jpg;*.jpeg) | *.jpg;*.jpeg | すべてのファイル(*.*) | *.*"; if(myDLG->ShowDialog() != System::Windows::Forms::DialogResult::OK){ return; } pictureBox1->Image->Save(myDLG->FileName); Invalidate(); } private: System::Void 閉じるCToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { if(MessageBox::Show("アプリケーションを終了しますか?","画像描画",MessageBoxButtons::OKCancel,MessageBoxIcon::Question) == System::Windows::Forms::DialogResult::OK){ this->Close(); } } private: System::Void 編集ToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { } private: System::Void 回転180ToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { } } よろしくお願いします。

  • プログラムへの画像埋め込み(?

    Visual C++でカレンダーを作っています 前後矢印のボタンを押せば、カレンダーがそれぞれ前後の月に移動し それに伴いカレンダー脇に表示される画像も変更される、 というプログラムなのですが、デバッグではキチンと動くのに いざアプリケーション単体では動作しません。 素人ながら思うには、プログラム中では private: void Hyouji(System::Object^ sender, System::EventArgs^ e) { DateTime tm=DateTime(myYear,myMonth,1); String^ FileName="Gazou/"+filename[myMonth-1]+".jpg"; monthCalendar1->SelectionStart=tm; monthCalendar1->SelectionEnd=tm; pictureBox1->Image=gcnew Bitmap(FileName); this->Invalidate(); } として、Gazouフォルダ内の画像を参照しているから起動しているのであって アプリケーション単体ではそれができていないのだと思うのですが、 はたしてそれで合っていますでしょうか。 もしそうならば プログラム中に画像ファイルを埋め込むことができれば解決すると思うのですが、 それにはどうすれば良いか、ご教授願えますでしょうか よろしくお願いします

  • 複数画像表示切り替え Visual c++

    Visual Studio C++ を用いて、複数選択した画像をPictureBoxに順に表示させて、一定時間間隔で、表示される画像が切り替わるようなプログラムを作りたいと考えています。 現在のところ、ファイル選択ダイアログで表示させたい画像を複数選択し、OpenFileDialogのFileNamesにファイル名を配列の形で格納します。 ここからが問題なのですが、それらのファイル名を順に呼び出して、PictureBoxに表示させて、Sleep()で任意の時間待って、また次の画像ファイルを呼び出して・・・というふうにしたのですが、実行させてみると、最後に選択された画像ファイルのみが表示されて終わってしまいます。 複数選択した画像ファイルを一定時間間隔で切り替えるには、もっと特別なことを考えないといけないのでしょうか。具体的な考え方、コーディングの仕方を教えていただけると幸いです。 以下に、ソースコードを示します。 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・省略 // //button1 // private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { openFileDialog1 = gcnew OpenFileDialog(); openFileDialog1->Multiselect = true; if(openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK){ array<String^> ^filename = gcnew array<String^>(openFileDialog1->FileNames->Length); for(int i=0; i<openFileDialog1->FileNames->Length; i++){ filename[i] = openFileDialog1->FileNames[i]; } } } // //button2 // private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { Bitmap^ bmp; for(int i=0; i<openFileDialog1->FileNames->Length; i++){ bmp = gcnew Bitmap(openFileDialog1->FileNames[i]); pictureBox1->Image = bmp; Sleep(100); } }

  • Bitmapデータ型の画像幅の拡大

    現在Visual studio 2005のフォームアプリケーションでプログラミグを行っている者です。以下のプログラムの中に画像の幅であるw,hという変数があるのですが、私の作ろうとしている画像処理の関係上、この画像データの幅を倍にしたいです(例:3*w,3*h)。しかし、変数宣言(例:int 3*w)やfor文の中で倍にしようとしても、ビルドはできるものの"アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。・・・パラメータは正の値で、高さより小さい値指定しなければなりません。"とでて、実行できません。おそらく倍にしてあげたとこで、倍になった部分の画像データがわからないためこういったエラーが出てしまうのだと考えています。どうにかして、BITMAPデータ型で読み込んだ画像の幅を倍の数値を得たいのですが、エラーのでないようにするためにはどのようにしてあげればいいのでしょうか?わかる方がいたらよろしくお願いします。 プログラムは以下のとおりです。 #pragma once // 省略 // } #pragma endregion private:Bitmap^ pic; private:array< Bitmap^>^ bmp; // 原画像格納 // private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { bmp[0] = gcnew Bitmap("画像ファイル1",true); pictureBox1->Image = bmp[0]; pic = gcnew Bitmap("画像ファイル2",true); } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { int x,y,a,b; /* x,y: 画像の座標 a,b: 複合画像の座標 */ int w = pic->Width; //ここでpic->Width*3としてもエラー /* 複合画像の横幅 */ int h = pic->Height; /* 複合画像の縦幅 */ x = 0; y = 0; a = 0; b = 0; for(y = 0; y < h; y++){ //ここで3*hとしてもエラー for(x = 0; x < w; x+=3){ pic->SetPixel( x, y, bmp[1]->GetPixel( x, y ) ); } } pictureBox2->Image = pic; } }; }

  • プログラムで、bmpをjpgに替えたらエラーして困ってます・・・。

    マネージ形式でbmpの画像の情報をlabel1などで表示できたんですけど、ファイル名の形式をjpgにしたら、情報が表示できずにエラーしました。 どこがまちがってるか、教えてください。 エラーした、プログラムをのせるんでアドバイスお願いします。 private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {   Bitmap^image2; image2 = gcnew Bitmap( "画像名.jpg");   pictureBox1->Image = image2;        label3->Text = String::Format("幅(width) 高さ(height): {0}", image2->Size); } この、プログラムで、bmgの時は、image2 = gcnew Bitmap( "画像名.bmp");で、組んでエラーはなっかたんですけど、jpgの時は、image2 = gcnew Bitmap( "画像名.jpg");でしたら、エラーします。 MSDNで探してもわからず、色々試したんですがエラーしかでません。 ネットで検索してもあまりいい例が見つかりませんでした。適切なアドバイスお願いします。

  • 二つの画像を並べて表示

    ひとりで独学でVC++2005を勉強してるのですが、pictureBoxでつまずいます。初心者ですがわかりやすく教えて頂けたらと思います。 やりたい事はタイトル通り、画像を単純に並べて表示したいだけなのですが、WEB場で検索しても的を得た答えが見つかりませんでした。 二つの画像を読み込んで、新しいBitmapデータに書き込めばいいのかと思ったのですが、どうやっていいのか見当が付きません。 Bitmap^ bmpA = gcnew Bitmap("testAA.bmp"); Bitmap^ bmpB = gcnew Bitmap("testAB.bmp"); int w = bmpA->Width + bmpB->Width; int h = bmpA->Height + bmpB->Height; Bitmap^ bmp = gcnew Bitmap(w,h); //ここで何やっていいかわかりません。 pictureBox1->Image = bmp; 最終的にはタイル的にどんどん並べて行きたいと考えています。 助言の方よろしくお願いします。

  • 画像読み込み時のOutOfMemory

    VC++2010ExpressのWindows Applicationで画像のサムネールを作るプログラムを作っています。 概略、つぎの様なコーディングです(細部は気にしないで下さい)。 for filePath in dlg->Files{ try{ String^ FileName = Path::GetFileName(filePath); Image^ img = Image::FromFiles(filePath); Bitmap^ bmp = gcnew Bitmap(Image, 48, 48); bmp->Save(FolderPath + "\\Thumbnails\\" + FileName); } chactch(System::Exception^ err){ Debug::Print("{0}", err->Massages); } } 問題は、数万件の画像を処理したときに、数千件までは順調に処理が進むのに、そのあと「OutofMemory」とか「メモリー不足」とか「GDI+で汎用エラー」といった例外が続発してしまうことです。マネージコードなのでリソースは自動的に解放されると思うのですが、それでも間に合わないのでしょうか?何か対処方法があれば、ご教示ください。

  • 配列を使ったビットマップクラス

    VC++を使ったフォームアプリケーションでビットマップなどの画像を表示させ、ピクセル処理を施せるプログラムを作りました。このプログラム上ではピクチャボックスを1つ用意していますが、今後もっと多くのピクチャボックスが必要になってきます。以下のプログラムではBitmapクラスのbmpをピクチャボックス1の画像に入れています。単純にBitmapクラスのbmpを増やせば(例:bmp1)、ピクチャボックスが増えても平気ですが、処理の関係上配列を使いたいと思っています。なので下に書いてあるプログラムのbmp->という部分をbmp[0]->というふうに変えたいと考えています。自分なりに調べて(1)、(2)の部分を変えればいいと思うのですがどうもうまくいきません。わかる方がいたらご教授ください、おねがいします。 #pragma once namespace bmp { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::Text; using namespace System::Collections::Generic; /// <summary> /// Form1 の概要 /// /// 警告: このクラスの名前を変更する場合、このクラスが依存するすべての .resx ファイルに関連付けられた /// マネージ リソース コンパイラ ツールに対して 'Resource File Name' プロパティを /// 変更する必要があります。この変更を行わないと、 /// デザイナと、このフォームに関連付けられたローカライズ済みリソースとが、 /// 正しく相互に利用できなくなります。 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクタ コードを追加します // bmp = nullptr; ……… (1) //Bitmap^ bmp[300]; }      //省略// #pragma endregion //private: array<Bitmap^>^ bmp = gcnew array<Bitmap^>(300); ……… (2) private: Bitmap^ bmp; private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { bmp = gcnew Bitmap("C:/Documents and Settings/Owner/デスクトップ/lena.bmp",true); pictureBox1->Image = bmp; } private: System::Void pictureBox1_Click(System::Object^ sender, System::EventArgs^ e) { /*bmp = gcnew Bitmap("C:/Documents and Settings/Owner/デスクトップ/lena.bmp",true);*/ int x,y; int w = bmp->Width; int h = bmp->Height; for(x = 0; x < w; x++){ for(y = 0; y < h; y++){ if(x < (w * 0.05) || y < (h * 0.05) || (y > (h - (h*0.05)))&&(y < h) || (x > (w - (w*0.05)))&&(x < w)){ Color pixelColor = bmp->GetPixel( x, y ); Color newColor = Color::FromArgb( 255, 0, 0 ); bmp->SetPixel( x, y, newColor ); } } } pictureBox1->Image = bmp; } private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { } }; }