大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

画像形式の判定

著者:北本 敦
公開日:2023/08/31
最終更新日:2023/08/31
カテゴリー:技術情報
タグ:

北本です。
投稿の間隔が大きく空いてしまい申し訳ありません。

前回の内容は、WebClientでのサーバーから終わりのわからない連番のJPGファイルをダウンロードする際、404エラーで終わりを判定しようとすると、ファイルの非存在時にエラーページのHTMLにリダイレクトされる仕様になっているような場合にうまくいかないという話でした。今回はこの対策を考えます。

ここでは、ファイルの中身から画像ファイルであるかどうかを判定することにします。画像ファイルの先頭にはその形式を示すヘッダ情報が含まれていますので、その数バイト分を確認することで画像形式を判断することができます。例えば、JPEGの場合であれば先頭の2バイトが必ず「0xFF, 0xD8」になっています。

他の画像形式の例も挙げておきます。

形式先頭
JPEG0xFF, 0xD8
PNG0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A
BMP0x42, 0x4D
GIF0x47, 0x49, 0x46

 

では、以上を踏まえて前回のC#のコードを修正してみます。

IsMatchFileHeader、IsJpgというメソッドを追加しています。IsJpgがファイルのバイト列を受け取ってJPG形式であるかを判定するメソッドです。IsMatchFileHeaderはIsJpgから呼び出しているメソッドで、引数dataに指定したバイト列の先頭が、引数headerに指定したバイト列に一致しているかを判定しています。
もし、PNG、BMP、GIFの判定をしたければ、以下のようなメソッドを作成すればOKです。

また、前回はWebClient.DownloadFileでURLから直接ファイルを保存していましたが、WebClient.DownloadDataでバイト列として受け取り、それを前述のIsJpgメソッドでJPGファイルであるかを判定し、そうである場合のみファイルを保存するように変更しています。

以上、今回は先頭バイトから画像形式を判定する方法について取り上げました。
WebClientでの画像ダウンロードに関する話題はこれで終わりとします。

    上に戻る