画像形式の判定

北本です。
投稿の間隔が大きく空いてしまい申し訳ありません。
前回の内容は、WebClientでのサーバーから終わりのわからない連番のJPGファイルをダウンロードする際、404エラーで終わりを判定しようとすると、ファイルの非存在時にエラーページのHTMLにリダイレクトされる仕様になっているような場合にうまくいかないという話でした。今回はこの対策を考えます。
ここでは、ファイルの中身から画像ファイルであるかどうかを判定することにします。画像ファイルの先頭にはその形式を示すヘッダ情報が含まれていますので、その数バイト分を確認することで画像形式を判断することができます。例えば、JPEGの場合であれば先頭の2バイトが必ず「0xFF, 0xD8」になっています。
他の画像形式の例も挙げておきます。
形式 | 先頭 |
JPEG | 0xFF, 0xD8 |
PNG | 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A |
BMP | 0x42, 0x4D |
GIF | 0x47, 0x49, 0x46 |
では、以上を踏まえて前回のC#のコードを修正してみます。
IsMatchFileHeader、IsJpgというメソッドを追加しています。IsJpgがファイルのバイト列を受け取ってJPG形式であるかを判定するメソッドです。IsMatchFileHeaderはIsJpgから呼び出しているメソッドで、引数dataに指定したバイト列の先頭が、引数headerに指定したバイト列に一致しているかを判定しています。
もし、PNG、BMP、GIFの判定をしたければ、以下のようなメソッドを作成すればOKです。
また、前回はWebClient.DownloadFileでURLから直接ファイルを保存していましたが、WebClient.DownloadDataでバイト列として受け取り、それを前述のIsJpgメソッドでJPGファイルであるかを判定し、そうである場合のみファイルを保存するように変更しています。
以上、今回は先頭バイトから画像形式を判定する方法について取り上げました。
WebClientでの画像ダウンロードに関する話題はこれで終わりとします。