Visual Studio 2005でWindowsフォームのプログラミングで画像保存ができない

このQ&Aのポイント
  • 「Visual Studio 2005」のC++でWindowsフォームのプログラミングをしている際、画像保存ができない問題に困っています。
  • 「開く」は参考書を見ながらできたのですが、「保存」がうまくいかず困っています。
  • 保存処理の実装がわからないため、知識のある方に教えていただきたいです。
回答を見る
  • ベストアンサー

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;  } /*** ここからわかりません。 ***/ } 知ってる方がいましたら教えてください。よろしくお願いします。

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

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

MSDNなどで画像の保存方法などを調べたのでしょうか? 画像を読み込むのに pictureBox1->Image = gcnew Bitmap(myDLG->FileName); といった具合にしてますよね でしたら Bitmapクラスに保存するメソッドなどが準備されてい無いか または pictureBox1->Imageに代入しているのだからImageクラスに無いか といった予測が立つと思います ちょっと調べてみればわかることですが これらのクラスにSaveメソッドが存在します このSaveメソッドにファイル名とGIF,JPG,PNG,BMPなど出力形式を指定して使う方法がありますので調べてみましょう

judas15
質問者

お礼

お早い返答ありがとうございます。 もう少し自分で調べてみようと思います。

関連するQ&A

  • 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++

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

  • Visual Basic 2005で困ってます

    「ファイルを開く」ダイアログを表示して 画像ファイルを選択し、そのファイルをPictureboxに表示させたいのですが 画像が表示されずエラーが出てしまいます。 Private Sub 開くOToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 開くOToolStripMenuItem.Click Dim ofd As New OpenFileDialog() ofd.FileName = ""   ofd.InitialDirectory = "デスクトップ"       ofd.Filter = _ "すべてのピクチャーファイル(*.jpg;*.jpeg)|*.jpg;*.jpeg|すべてのファイル(*.*)|*.*"   ofd.FilterIndex = 2 ofd.Title = "開くファイルを選択してください" ofd.RestoreDirectory = True ofd.CheckFileExists = True ofd.CheckPathExists = True If ofd.ShowDialog() = Windows.Forms.DialogResult.OK Then Console.WriteLine(ofd.FileName) lstFileName.Items.Add(ofd.FileName) End If このようなプログラムなのですが どのように変えたらよろしいでしょうか? 教えてください、よろしくお願いします。

  • VC#で品質を指定してJpeg保存する方法

    pictureBox1に開かれている画像をJpegで保存する場合、以下のようにすると本に書いてありましたので、試してみたところ画質が悪かったです。 private void menuItem1_Click(object sender, System.EventArgs e) { if (saveFileDialog1.ShowDialog() == DialogResult.OK) { pictureBox1.Image.Save(saveFileDialog1.FileName,ImageFormat.Jpeg); } } 検索したところ、Jpegの場合、品質を指定することができるようですが(http://dobon.net/vb/dotnet/graphics/encoderparameters.html)、このサイトのは微妙に違うのでよくわかりません。 pictureBox1に開かれている画像をファイル名を指定して、Jpeg保存する方法を教えて下さい。よろしくお願いします。

  • VC#での24ビットbmp形式での保存方法

    VC#でbmpファイルで保存する場合、以下のようにImageFormat.Bmpとすると思いますが、これだと32ビットbmp形式で出力されます。 24ビットbmpで出力する方法はないでしょうか? if (saveFileDialog1.ShowDialog() == DialogResult.OK) { pb1.Image.Save(saveFileDialog1.FileName,ImageFormat.Bmp); }

  • VC#でのファイル保存

    private void Save_File_Click(object sender, System.EventArgs e) { if (saveFileDialog1.ShowDialog() == DialogResult.OK) {pb2.Image.Save(saveFileDialog1.FileName,ImageFormat.Jpeg);} } ↑のようにすると、「型または名前空間名 'ImageFormat' が見つかりませんでした。ディレクティブを使うかアセンブリ参照を使ってください。」とエラーがでます。 テキストを真似てプログラムしたのですが・・・ pb2はpictureBox2です(PictureBox pb2;pb2=pictureBox2;) よろしくお願いします。

  • デバッグエラー

    VBで、簡単なお絵かきツールを作りましたが、ボタン4(開くイベント)で、「開く」ではなく、キャンセルをクリックした際に、デバッグエラーが出ました。 プログラムを記載しておきますので、対処方法を教えていただけませんか。 Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click Dim filename As String OpenFileDialog1.AddExtension = True OpenFileDialog1.Filter = "すべてのファイル|*.*" OpenFileDialog1.ShowDialog() OpenFileDialog1.Title = "開くファイルを指定してください。" filename = OpenFileDialog1.FileName If filename <> "" Then b.Dispose() canvas.Dispose() canvas = Image.FromFile(filename) b = Graphics.FromImage(canvas) PictureBox1.Image = canvas End If End Sub です。 ちなみに、保存の際には出ません。

  • 【C#】ラバーバンドでのドラッグ矩形範囲の画像切抜

    現在C#にて画像を表示してラバーバンドで選択した範囲のみを切り抜いて画像ファイルとして保存する。 というツールを製作しているのですが、ラバーバンドの表示やピクチャボックス全体の画像ファイルの保存はできたのですが選択範囲のみを切り抜いて保存すると言う処理が私にはかけません。。 どなたか助けてはいただけないでしょうか? public partial class Form1 : Form { private int _xi, _yi, _xc, _yc; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //OpenFileDialogクラスのインスタンスを作成 OpenFileDialog ofd = new OpenFileDialog(); //はじめのファイル名を指定する ofd.FileName = ""; //はじめに表示されるフォルダを指定する ofd.InitialDirectory = @"C:\"; //[ファイルの種類]に表示される選択肢を指定する ofd.Filter = "TIFFファイル(*.tif;*.tiff)|*.tif;*.tiff|JPEGファイル(*.jpg;*.jpeg)|*.jpg;*.jpeg|PNGファイル(*.png)|*.png|ビットマップ(*.bmp)|*.bmp|すべてのファイル(*.*)|*.*"; //[ファイルの種類]ではじめに //「TIFFファイル」が選択されているようにする ofd.FilterIndex = 1; //タイトルを設定する ofd.Title = "開くファイルを選択してください"; //ダイアログボックスを閉じる前に現在のディレクトリを復元するようにする ofd.RestoreDirectory = true; //ダイアログを表示する if (ofd.ShowDialog() == DialogResult.OK) { //OKボタンがクリックされたとき //画像の大きさをPictureBoxに合わせる pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; //PictureBox1に選択した画像を表示する pictureBox1.ImageLocation = ofd.FileName; } } private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { if (e.Button != MouseButtons.Left) return; _xi = _xc = e.X; _yi = _yc = e.Y; pictureBox1.Invalidate(); } private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { if (e.Button != MouseButtons.Left) return; _xc = e.X; _yc = e.Y; pictureBox1.Invalidate(); } private void pictureBox1_Paint(object sender, PaintEventArgs e) { if(_xc == _xi && _yc == _yi) return; int x, y, w, h; if(_xc < _xi) { x = _xc; w = _xi - _xc; } else { x = _xi; w = _xc - _xi; } if(_yc < _yi) { y = _yc; h = _yi - _yc; } else { y = _yi; h = _yc - _yi; } e.Graphics.DrawRectangle(Pens.Black, x, y, w, h); } private void button2_Click(object sender, EventArgs e) { //SaveFileDialogクラスのインスタンスを作成 SaveFileDialog sfd = new SaveFileDialog(); // フィルターの設定 sfd.Filter = "TIFF形式|*.tif|GIF形式|*.gif|JPEG形式|*.jpeg|PNG形式|*.png|すべてのファイル(*.*)|*.*"; // ファイル保存ダイアログを表示 sfd.ShowDialog(); String extension = System.IO.Path.GetExtension(sfd.FileName); switch (extension.ToUpper()) { case ".TIF": // PictureBoxのイメージをTIFF形式で保存する pictureBox1.Image.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Tiff); break; case ".GIF": // PictureBoxのイメージをGIF形式で保存する pictureBox1.Image.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Gif); break; case ".JPEG": // PictureBoxのイメージをJPEG形式で保存する pictureBox1.Image.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Jpeg); break; case ".PNG": // PictureBoxのイメージをGIF形式で保存する pictureBox1.Image.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Png); break; } }

  • VC++:ダイアログがDispose()できない

    前略 ・.NET 2012のVC++を使っています。 ファイルをオープンするプログラムをつくろうとしています。その過程でダイアログをオープンするプログラムをネットにあったC#のコードを参考に、openFileDialog1->Dispose();をコメントアウトした以下に示すものをつくりました。このコードは特に問題なくコンパイルできて動作します。  しかし、C#のコードにあった openFileDialog1.Dispose();から変更したopenFileDialog1->Dispose();を追加すると "error C2039: 'Dispose' : 'System::Windows::Forms::OpenFileDialog' のメンバーではありません。"と云うエラーメッセージがでてコンパイルできません。 <質問>  VC++の場合 C#のopenFileDialog1.Dispose();に相当するオブジェクト破棄のコードは不要なのでしょうか?  もし、破棄が必要なのであればどのようなコードを書けばよいのでしょうか?  どなたかお分かりになる方、ご教示いただければ幸いです。 以上、よろしくお願いします。 //------------------------------------------------------- private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog();//new OpenFileDialog(); openFileDialog1->Title = "ダイアログのタイトルをココに書く"; openFileDialog1->InitialDirectory = "c:\\"; openFileDialog1->FileName = "初期表示するファイル名をココに書く"; if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) MessageBox::Show(openFileDialog1->FileName); // 不要になった時点で破棄する (正しくは オブジェクトの破棄を保証する を参照) // openFileDialog1->Dispose(); };

  • VC++でファイルへの書き込みについて

    VC++にて、ファイルへの書き込みを行っているのですが、どうもうまくいきません。 Form.h //ファイル->開く private: System::Void 開くOToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { //開くダイアログ表示 OpenFileDialog^ dlg = gcnew OpenFileDialog(); dlg -> Filter = "CSV形式(*.csv)|*.csv|すべてのファイル(*.*)|*.*"; if (dlg -> ShowDialog() != System::Windows::Forms::DialogResult::OK){ return; } //CSV形式でファイルを読み込み LoadCsvFile( dlg -> FileName ); } //ファイルの読み込み private: bool LoadCsvFile( String^ path ){ //ファイルをオープン StreamReader^ reader = gcnew StreamReader( path, System::Text::Encoding::GetEncoding("shift-jis")); //ファイル読み込み String^ data; data = reader -> ReadLine(); st = from_cli(data); //dataをグローバル変数std::string = stに変換 reader -> Close(); return true; } //System::String -> std::string変換用 std::string from_cli(String^ input, Encoding^ encoding) { array<Byte>^ result = Encoding::Convert(Encoding::Unicode, encoding, Encoding::Unicode->GetBytes(input)); if ( result->Length != 0 ) { pin_ptr<unsigned char> pin = &result[0]; return std::string(reinterpret_cast<char*>(pin), result->Length); } return std::string(); } //ボタンクリックイベント private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { std::ofstream ofs; ofs.open( "test.txt" ); ofs << st << std::endl; ……(1) ofs.close(); } csvファイルを読み込み後、ボタンクリックイベントを行ってもtext.txtの内容が書き変わりません。 (1)の部分をofs << "test" << std::endl;に変更したり、 button1_Click内で変数st2を宣言し、 ofs << st2 << std::endl;に変更すると、問題無くファイルへの書き出しが行えます。 文字コード等が関わっているのでしょうか? 御助言の程、よろしくお願いします。