web-dev-qa-db-ja.com

バイト配列が有効な画像であるかどうかを確認するにはどうすればよいですか?

チェック用の.Net関数が存在しないことは知っていますが、バイト配列を使用する前に、バイトが有効なイメージであるかどうかをチェックするアルゴリズムまたは簡単で効果的な方法はありますか。これが必要なのは、クライアントを常にリッスンしているサーバーにさまざまなコマンドを送信していて、コマンドの1つがサーバーのコンピューターのスクリーンショットを取得することだからです。

20
Daniel Lopez

バイト配列から画像を生成し、そうでない場合はArgumentExceptionを確認できます。

public static bool IsValidImage(byte[] bytes)
{
    try {
        using(MemoryStream ms = new MemoryStream(bytes))
           Image.FromStream(ms);
    }
    catch (ArgumentException) {
       return false;
    }
    return true; 
}
34
shf301

前述のように、イメージにロードしようとすることが唯一のフェイルセーフな方法です。 [予想される]画像タイプに基づいて、magick番号(別名ファイルヘッダー)を確認できます。たとえば、*。PNGファイルの最初の8オクテットは、16進数で次のようになります。

0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A

http://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header

他のほとんどのタイプの画像ファイルには、同様のマジックナンバーがあります。

ただし、これを確認しても、ファイルが有効な画像ファイルであるかどうかは実際にはわかりません。その後にわかるのは、magick番号は、そのファイルがタイプXであることを示しているように見えることです。それでも、切り捨てられたり、破損したりする可能性があります。適切な場所。

9
Nicholas Carey

JPEGの場合、最初の2バイトが0xFF、0xD8であり、最後の2バイトが0xFF、0xD9であることを確認できます。もちろん、画像データがEOIタグと一致する可能性はありますが、これはまれなことです。

3
Yaur