none
BitmapImageの検証について RRS feed

  • 質問

  • JPEG データの入ったストリームデータを Image コントロールへ表示させる為に,Converter で
    ストリームを BitmapImage へ変換 (StreamSourceプロパティで設定) して Image の Source へ
    バインディング といった事を考えています.

    ところが,この JPEG データが信用ならない (中身が壊れたデータをよこす事がある) ので BitmapImage へ
    設定した後,EndInit() を呼ぶと NotSupportedExceptoin を出すのですが,この辺りの検証 (チェック) を
    うまい事行う方法って無いものでしょうか?

    2010年2月27日 16:45

回答

  • 正当かどうか途中まで読み進めたとして、結局正当なファイルならその読み進めた分もデコーダが有効に使えるわけですから、ロード前に検証するというのは意義が薄いと思います。ストリームからのロード・画像のデコードに比べれば例外送出のコストなど大したことはないでしょう。
    また Stream の場合シーク不可能な可能性もあるわけで、そうしたときどうするかという判断も必要になってきます。

    少なくとも System.Windows.Media.Imaging 名前空間内にそういう手段を提供するものは見あたりません(見落としがあるかも知れませんけど)。
    2010年2月28日 5:44

すべての返信

  • 現在の実装の挙動がどう不満で、どんな挙動になれば「うまいこと」になるんでしょうか?
    2010年2月28日 1:12
  • 現在は,中身がまともな JPEG かどうか分からない Stream を一旦 StreamSource へ設定した後,EndInit()を
    呼んで例外が出た後でしかデータがおかしいと分からないのですが,これを例外を出さずに不正なデータかどうか
    分からないかなぁ...,と思いまして.

    StreamSource へ設定する前,或いは設定した後 EndInit() を呼ぶまでの間に不正なデータかどうか検証できれば
    例外も吐かずに済むかと思いました.

      - 例外が出た事によって不正なデータと判断する
      - 例外が出る前に何らかの検証を行って不正なデータと判断する

    のどちらがいいのか迷っておりまして,また後者の方法を取るとしてどういった方法があるのか,と疑問に思いまして
    質問させて頂きました.

    判断の手助けとなるお知恵を拝借できれば幸いです.

    2010年2月28日 4:50
  • 正当かどうか途中まで読み進めたとして、結局正当なファイルならその読み進めた分もデコーダが有効に使えるわけですから、ロード前に検証するというのは意義が薄いと思います。ストリームからのロード・画像のデコードに比べれば例外送出のコストなど大したことはないでしょう。
    また Stream の場合シーク不可能な可能性もあるわけで、そうしたときどうするかという判断も必要になってきます。

    少なくとも System.Windows.Media.Imaging 名前空間内にそういう手段を提供するものは見あたりません(見落としがあるかも知れませんけど)。
    2010年2月28日 5:44
  • Hongliang 様

    ご回答有難うございます.
    確かにコスト的にも例外で判断した方が計算コストも掛からなくて良さそうです.
    2010年2月28日 6:40