ソリューションエクスプローラ内のファイルについて

タグの編集
投稿者 中学生  () 投稿日時 2008/8/9 03:48:00
こんにちは。僕はVB2008を使っている初心者です。 
ソリューションエクスプローラで画像ファイルを入れたフォルダを作ったのですが、どう書けばその画像を使えるのかわかりません。 
NewFolder1 
    | 
    |____"image.jpg" 
 
という感じです。
投稿者 るきお  () 投稿日時 2008/8/9 21:31:00


こんにちは。 
外部の画像ファイルの使用方法はソリューションエクスプローラに追加されていてもいなくても同じです。 
つまりパス名を使用して、Image.FromFileなどで読み込みます。
投稿者 るきお  () 投稿日時 2008/8/9 21:35:00


(続きです。) 
たとえば、最初の画像のようにソリューションエクスプローラに設定したとき、実際の画像の場所はプロジェクトが保存してあるフォルダの中にあるNewFolder1フォルダになります。 
 
たとえば、Cドライブにこのプロジェクトを保存した場合画像のパスはC:\VB\WindowsApplication1\WindowsApplication1\NewFolder1\image.jpgです。 
 
だから、プログラムからこの画像を表示するにはたとえば次のようなコードを書きます。 
PictureBox1.Image = Image.FromFile("C:\VB\WindowsApplication1\WindowsApplication1\NewFolder1\image.jpg") 
 
とはいえ、これだと友達のパソコンでプログラムを動かすようにする時に大変ですし、いろいろとデメリットがあります。そこで相対パスを使って指定するか、リソースとして取り込む方法が一般的です。 
 
詳細は省きますので、わからなければ別途質問してください。 
 
とにかく、ソリューションエクスプローラに追加されていようがいまいが、画像ファイルの扱いには関係ないのです。
投稿者 あにす  () 投稿日時 2008/8/10 08:05:00
あとから画像を差し替える可能性が無いのならリソースに埋め込むのが良いと思います。 
あとから画像を差し替える可能性があるのなら、ビルドイベントでプロジェクト内の画像ファイルをコンパイル先のフォルダにコピーするように設定するのが楽だと思います。 
プロジェクトのプロパティのビルドイベントに 
COPY "$(ProjectDir)*.jpg" "$(TargetDir)" 
と書けば、全てのjpgファイルを実行ファイルと同じフォルダにコピー出来ます。
投稿者 魔界の仮面弁士  () 投稿日時 2008/8/11 20:28:00


<1>の るきおさんのような構成になっている場合には、 
その画像のプロパティで、[出力ディレクトリにコピー]が 
どのように設定されているのかによって、 対応方法が異なります。 
 
 
============================================================ 
《出力ディレクトリにコピー:常にコピーする》 
《出力ディレクトリにコピー:新しい場合はコピーする》 
------------------------------------------------------------ 
上記いずれかが設定されている場合、EXE のあるディレクトリの下に、 
NewFolder1 フォルダが展開され、その下に image.jpg ファイルが配置されます。 
あとはこれを、るきおさんが書かれておられるように 
 Dim file As String = System.IO.Path.Combine( _  
  My.Application.Info.DirectoryPath, _  
  "NewFolder1\image.jpg")  
 PictureBox1.Image = Image.FromFile(file)  
といったコードで読み込むことができます。 
 
 
============================================================ 
《出力ディレクトリにコピー:コピーしない》 
------------------------------------------------------------ 
これが設定されているとimage.jpg はファイルとしては配置されないため、 
プログラムから利用するためには、もう一つのプロパティ 
《ビルドアクション:埋め込まれたりソース》 
を設定する必要があります。埋め込まれたリソースを読みこむには、 
 Dim file As System.IO.Stream 
 With System.Reflection.Assembly.GetExecutingAssembly 
  file = .GetManifestResourceStream("WindowsApplication1.image.jpg") 
 End With 
 PictureBox1.Image = Image.FromStream(file) 
というコードを書けば OK です。この方法の場合、指定するのが 
「NewFolder1\image.jpg」という文字列ではなく 
「WindowsApplication1.image.jpg」になる事に注意してください。 
 
 
============================================================ 
もうひとつの方法 
------------------------------------------------------------ 
[My Project]を開き、その中の「リソース」タブを設定するというのが 
一番簡単な方法です。以下のように、わずか一行のコードで利用できます。 
 'これだけで、画像クラス(System.Drawing.Bitmap)が得られる  
 PictureBox1.Image = My.Resources.image  
なお、この方法の場合、リソース名にピリオド(.)は使えません。
投稿者 中学生  () 投稿日時 2008/8/13 00:31:00
>>5 
みなさん返信遅くなってしまって、すみませんでした。 
画像までつけて解説してくださってありがとうございます。 
実行時ファイルと同じフォルダに画像ファイルを入れるという方法を使わせてもらいました。 
ありがとうございます