C++CLI GetCurrentDirectorで画像ファイルを読み込めない問題の解決方法

このQ&Aのポイント
  • C++CLIでGetCurrentDirectorを使用して画像ファイルを読み込む際に問題が発生しています。
  • MessagaBoxで表示される区切り記号が¥マークであることが判明しました。
  • 対処方法としては、GetCurrentDirectorの結果に対して¥マークをエスケープする必要があります。
回答を見る
  • ベストアンサー

C++CLI GetCurrentDirector

画像ファイルをPictureBoxに読み込みたいのですが、うまくいきません。 String^ CurrentDirectory = System::IO::Directory::GetCurrentDirectory() + "/picture1.png"; pictureBox1->Image = Image::FromFile(CurrentDirectory); としているのですが、うまく画像ファイルを読み込めません。 MessagaBoxでSystem::IO::Directory::GetCurrentDirectory()の部分を表示してみると、 区切り記号が¥マークが一つでした。 System::IO::Directory::GetCurrentDirectory()の部分を文字列で直接入力すると、うまく動作します。 ¥マークが影響している様に思うのですが、対処の仕方がわかりません。 アドバイスよろしくお願いいたします。

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

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

例外が発生するならその内容を明示したほうがいいと思いますよ String型に取り込んだファイルパス文字列の \は1つで正解です コードで記述する際の '' や "" で囲んだ 文字や文字列の中で \をあらわすには \\といった具合に2個重ねます IDE上で起動する場合と EXEをエクスプローラなどで直接起動する場合で CurrentDirectoryが変わってしまうことを考慮しているのでしょうか IDE上ですと ソリューションフォルダーが カレントです EXE直接ですと EXEのおいてあるフォルダーがカレントになります

tamuhiro1004
質問者

お礼

ありがとうございます。 imageフォルダをEXEのフォルダに入れる事で無事解決できました。

関連するQ&A

  • C#を勉強していて、指定したフォルダから画像を読み込んでピクチャボック

    C#を勉強していて、指定したフォルダから画像を読み込んでピクチャボックスに次々と表示するスライドショーを作っています。 それで次のように作りました。 string[] files = System.IO.Directory.GetFiles(@"c:\test\", "*.jpg");  foreach (string file in files)  {   pictureBox1.Image = Bitmap.FromFile(file);   this.pictureBox1.SizeMode = PictureBoxSizeMode.Zoom; Thread.Sleep(1000);  } しかしこれではフォルダの最後の画像しか表示されません。 この場合次々と画像を表示するにはどうしたらいいか教えてください。

  • 挿入されている画像をクリアする(VB.2003)

    VB.NET2003 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'ピクチャーボックス1~2のイメージをクリア For Each picBox As PictureBox In New PictureBox() {PictureBox1, PictureBox2} picBox.Image = Nothing Next 'ピクチャーボックス3~4にイメージを設定 PictureBox3.Image = Image.FromFile("C:\image03.jpg") PictureBox4.Image = Image.FromFile("C:\image04.jpg") End Sub Private Sub PictureBox3to4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox3.Click, PictureBox4.Click For Each picBox As PictureBox In New PictureBox() {PictureBox1, PictureBox2} If picBox.Image Is Nothing Then picBox.Image = sender.Image Exit Sub End If Next End Sub 上記は、ピクチャーボックス3~4のどれかが押されるとピクチャーボックス1に押された画像が挿入され、 次にピクチャーボックス3~4のどれかが押されると次はピクチャーボックス2に押された画像が挿入されるプログラムなのですが、 ボタン1を押すと、元に戻す「ピクチャーボックス1、2に挿入されている画像があればクリアする」プログラムを 作りたいのですが、サッパリ分かりません。 どなたかご教授願います┏○

  • どこにどの画像が入ったか判定してくれるプログラム(VB.NET2003)

    VB.NET2003 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'ピクチャーボックス1~2のイメージをクリア For Each picBox As PictureBox In New PictureBox() {PictureBox1, PictureBox2} picBox.Image = Nothing Next 'ピクチャーボックス3~4にイメージを設定 PictureBox3.Image = Image.FromFile("C:\image03.jpg") PictureBox4.Image = Image.FromFile("C:\image04.jpg") End Sub Private Sub PictureBox3to4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox3.Click, PictureBox4.Click For Each picBox As PictureBox In New PictureBox() {PictureBox1, PictureBox2} If picBox.Image Is Nothing Then picBox.Image = sender.Image Exit Sub End If Next End Sub 上記は、ピクチャーボックス3~4のどれかが押されるとピクチャーボックス1に押された画像が挿入され、 次にピクチャーボックス3~4のどれかが押されると次はピクチャーボックス2に押された画像が挿入されるプログラムなのですが、 あるカードゲームの役判定をするため、どこにどの画像が挿入されたか判定するプログラムを作りたいのですが、 (例えば、ピクチャーボックス1にピクチャーボックス3の画像が挿入されているのなら「1-3」、4なら「1-4」です。と出力する) 難しすぎて全く分かりません・・・。  どなたかご教授願いします┏○

  • pictureboxに表示した画像のファイル名を取得したい。

    PictureBox1.image=image.fromfile("c:\a.jpg") のように画像を表示したピクチャーボックスの ファイル名c:\a.jpgを取得するには どのように書いたら良いでしょうか。 VB.NETでございます。m(__)m

  • C#「オブジェクト参照が必要です」(初心者)

    Visual C# 2008を学習中なんですが、とりあえず何か作ってみようと思って、パラパラマンガに挑戦してみました。 Form1にpictureBox1を作り、waitを入れてイメージを書き換えるという単純なものです。 ところが実行しようと思ったら、「静的でないフィールド、メソッド、またはプロパティ’WindowsFormApplication1.Form1.pictureBox1’でオブジェクト参照が必要です」というエラーが出ます。その際のフォーカスは、main()内の Form1.pictureBox1.image = Image.FromFile("motion1.png"); ”Form1.pictureBox1”に当てられています。 何が原因と考えられるでしょうか。 もし情報不足であればご指摘いただくか、あるいはこの目的においてやらなければいけないこと、を大雑把に教えていただくだけでも幸いです。 よろしくお願いします。

  • 【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; } }

  • 一度PictureBoxに表示させたファイルを削除したい(VB2005)

    VB2005の質問です。 一度PictureBoxに表示させたファイルを削除したいと考えています。 例 --------------------------------------------------------   Private FileName As String = "C:\パス"      'パス名   '画像の表示   Sub foo()     PictureBox1.Image = Image.FromFile(FileName)   End Sub   'ファイルの削除   Sub bar()     PictureBox1.Image = Nothing     System.IO.File.Delete(FileName)    'a)エラー発生。削除できない   End Sub -------------------------------------------------------- 上記のコードですと(a)の箇所でエラーが発生します。エラー内容は、「別のプロセスで使用されているためファイルにアクセスできません」、というものです。 このファイルを削除するには、どのような処理が必要でしょうか。 以上、どうぞよろしくお願い致します。

  • C# PictureBoxで使用した元画像を削除できない

    現在PictureBoxに表示させた画像を、PictureBoxを定義しているFormを閉じた瞬間削除しようと考えています。 例) メインFormからPictureBoxを定義しているSubFormを表示します。 PictureBoxに、ローカルマシンにある任意のファイルをImageとして表示させます。 pictureBox1.Image = Image.FromFile(@"C:xxx.jpg"); このFormを閉じた後、PictureBoxで表示していたファイルを削除したいのですが、「他のユーザが使用しているため、削除できません」というエラーが発生して削除が実行できません。 ガベージが実行されていないからか?と考え、Formを閉じるときに以下の処理を行いました。 pictureBox1.Image = null; pictureBox1.Dispose(); それでも結果は変わりませんでした。 メインFormからサブFormとして行った場合のみ、本現象が発生します。 メインFormが閉じられれば、その直後からファイル削除を実行できます。 どうか、よろしくお願いいたします。

  • visual C++でのツール番号の指定方法

    Visual C++では、pictureBoxやtextBoxなどのツールがありますが、例えば、以下のようにpictureBoxの番号にあったファイルを表示する場合にはどのように書き込めばいいでしょうか? pictureBox1→1.bmpを開く pictureBox2→2.bmpを開く ・・・ pictureBoxn→n.bmpを開く nの数が少なければ、 pictureBox1->Image=Image::FromFile("C:/Users/1.bmp"); のように書いていけばいいですが、nの数が多くなれば、その分書き込まなければならないですし、 この番号をプログラム内でfor文などで指定できるようにするにはどのように書き込めばいいでしょうか?

  • 【C#】GraphicsのhDcについて

    C#でアプリケーションを作成しています。 PictureBoxに読み込んだ画像を画像処理ライブラリにGraphicsのhDcを渡し、処理をさせたいのですが、 Bitmap bmp = new Bitmap("ファイル名"); pictureBox1.Image = bmp; Graphics g = Graphics.fromImage(pictureBox1.Image); IntPtr hdc = g.GetHdc(); というふうに作った[hdc]を渡すと真っ黒な画像が表示されてしまいます。 ピクチャーボックス1のPaintイベント pictureBox1_Paint(object sender, PaintEventArgs e) { // pictureBox1.Imageには上と同じ画像を読み込み済み IntPtr hdc = e.Graphics.GetHdc(); } というふうに作った[hdc]を渡すと、正常に処理された画像が表示されます。 質問なのですが、PictureBox1.Imageから作ったGraphicsとPaintEventArgs.Graphicsはどのような差があるのでしょうか? また、PaintEventArgsを使わず同じようなGraphicsを作るにはどうしたらいいでしょうか? 至らない説明で申し訳ありませんが、ご助言をよろしくお願いします。

専門家に質問してみよう