none
パスが正確でない場合の画像表示について RRS feed

  • 質問

  • VisualBasicに関して質問です。

    現在以下のようにして、ListBoxに書き出したファイルをPictureBoxに表示するようにしています。

            ListBox1.SelectedIndex = 0
            PictureBox1.ImageLocation = ListBox1.Text
    そこで、①このListBoxに書き出されたファイル名のものが存在しない時、②ListBoxになにも書き出されていない時

    の2つの場合に特定の画像を表示したいと思っています。

           

            If PictureBox1.ImageLocation = Nothing Then
                PictureBox1.ImageLocation = ".¥01picture.jpg"
            End If
    これを追加してみましたが、まあうまくいきません。

    なにか方法がありましたら、ご教示ください。よろしくお願いします。

    ー補足ですー

    このアプリケーションはUSBメモリに保存し、タブレット端末で使用しています。タブレット端末に保存された画像を用いるのですが、他端末にこのUSBを挿しアプリを開くとパスが正しくないので当然画像が表示されません。具体的には、PictureBoxの中央に赤い×のある白い四角が小さく表示されます。この場合に、".¥01picture.jpg"を表示したいです。(".¥01picture.jpg"はUSBのアプリケーションのところに保存しています。)
    • 編集済み 6503 2018年10月7日 7:53 補足
    2018年10月7日 5:49

回答

  • ErrorImageにはSizeModeは適用されませんね。

    SizeModeを適用したエラー画像にしたいのであれば、ErrorImageに変わって、LoadCompletedイベントを使用するのがいいでしょう。

    画像の読み込みに失敗した場合は、このイベントにてe.ErrorプロパティにExceptionオブジェクトが設定されます。成功した場合はNothingになるので、「e.ErrorがNothingでなければImageプロパティにファイルからNewしたBitmapオブジェクトをセット」という感じで。

    • 回答としてマーク 6503 2018年10月7日 9:44
    2018年10月7日 8:37

すべての返信

  • > ①このListBoxに書き出されたファイル名のものが存在しない時

    それは質門者さんの方でも分かりますよね。

    問題は、ファイルは存在するが、

    > ②ListBoxになにも書き出されていない時

    即ち .jpg ではないもしくは壊れているという場合だと思いますが、であれば、以下のスレッドにあるように、ファイルから Bitmap を作成できるか否かを調べて判断してはいかがですか?

    読み込めない「Jpeg」ファイルについて
    https://social.msdn.microsoft.com/Forums/ja-JP/7f5f80b8-da2d-4cc0-8c10-e20143f96ef1/jpeg?forum=vbgeneralja

    他に、もっと簡単に、ファイルの先頭2バイトと最後の2バイトを調べるとかも書いてありますので見てください。

    2018年10月7日 6:22
  • ①、②については、SurferOnWww 様のアドバイス、リンク先を読んでいただくとして・・・。

    「相対パス形式で書いた文字列(画像ファイルのパス)を、VB が判断してくれない」ことが困り事であるなら、以下の通り、絶対パス形式に直してセットすると行けるのではと思います。


    相対パスから絶対パスを取得する、絶対パスから相対パスを取得する
    https://dobon.net/vb/dotnet/file/getabsolutepath.html

    PictureBox1.ImageLocation = System.IO.Path.GetFullPath(".\01picture.jpg")
    ※「¥」を「\」半角にしています。
    ※相対パスを理解するには、基準となるディレクトリ(通常は、exe ファイルのフォルダパス)を意識しないと、予想しているパスとは違うパスを返してくることがあるので注意です。
    2018年10月7日 6:54
  • 返信ありがとうございます。

    質問が情報不足でうまく説明できていないかもしれません。

    このアプリケーションはUSBメモリに保存し、タブレット端末で使用しています。タブレット端末に保存された画像を用いるのですが、他端末にこのUSBを挿しアプリを開くとパスが正しくないので当然画像が表示されません。具体的には、PictureBoxの中央に赤い×のある白い四角が小さく表示されます。この場合に、元の質問にある".¥01picture.jpg"を表示したいです。(".¥01picture.jpg"はUSBのアプリケーションのところに保存しています。)

    以上、補足です。またご意見いただければ幸いです。

    2018年10月7日 7:49
  • ErrorImageプロパティを設定しておけば、存在しないファイルや画像として読み込めないファイルがImagePath指定された時に代替として表示させることができます。

    PictureBox1.ErrorImage = New Bitmap(ファイルパス)

    ただしImagePathにNothingまたは空文字列が設定された場合、[エラーなのでエラー画像表示] ではなく [画像クリア扱いなので何も表示しない] になりますので、そうなる可能性があるなら事前に考慮しておきましょう。

    それから、相対パスは安定しない(必ずしも実行ファイルと同じフォルダを基準にするとは限らない)ので、実行ファイルと同じフォルダにあるパスを使用するのなら、実行ファイルと同じフォルダを返すApplication.StartupPathと、その相対パスを、Path.Combineで結合して絶対パスに変換するようにすると良いでしょう。

    2018年10月7日 8:04
  • 回答ありがとうございます。

    相対パスが安定しないというのは勉強になりました。絶対パスへの変換をもう少し勉強して理解しようと思います。

    ErrorImageプロパティの設定で、表示する画像を設定することができました。ただ、そのサイズモードを変更する方法がわかりません。ご存知でしたらご教示ください。

            PictureBox1.ErrorImage = New Bitmap(".¥01picture.jpg")
            PictureBox1.SizeMode = PictureBoxSizeMode.Zoom

    これで試していますが思ったようにZoomとなりません。

    またご意見いただければ幸いです。

    2018年10月7日 8:26
  • ErrorImageにはSizeModeは適用されませんね。

    SizeModeを適用したエラー画像にしたいのであれば、ErrorImageに変わって、LoadCompletedイベントを使用するのがいいでしょう。

    画像の読み込みに失敗した場合は、このイベントにてe.ErrorプロパティにExceptionオブジェクトが設定されます。成功した場合はNothingになるので、「e.ErrorがNothingでなければImageプロパティにファイルからNewしたBitmapオブジェクトをセット」という感じで。

    • 回答としてマーク 6503 2018年10月7日 9:44
    2018年10月7日 8:37
  • > このアプリケーションはUSBメモリに保存し、タブレット端末で使用しています。タブレット端末に保存された画像を用いるのですが、

    何でそれを最初の質問の一行目に書いてもらえないのですか? 次回質問する際は、情報の後出し小出しがないよう、十二分な配慮お願いします。

    2018年10月7日 9:37
  • Hongliang さん、

    教えていただいた方法で画像が表示され、Sizemodeも適用されました。本当にありがとうございます。

    別件ですが、音声ファイルのパスが正しくない時に、他フォームに設置したLabelに”音声を選択”と表示したいと思っています。教えていただいたLoadCompletedで解決できるかと思いましたがうまくいきませんでした。別スレッドにて再度質問してみようと思います。よろしければそちらもよろしくお願いします。

    2018年10月7日 9:39
  • > このアプリケーションはUSBメモリに保存し、タブレット端末で使用しています。タブレット端末に保存された画像を用いるのですが、

    何でそれを最初の質問の一行目に書いてもらえないのですか? 次回質問する際は、情報の後出し小出しがないよう、十二分な配慮お願いします。

    失礼しました。歴2週間の素人なのでその一行が大事な情報だと思っていませんでした。今後気を付けます。

    ご指摘ありがとうございます。

    2018年10月7日 9:43