画像ファイルのフォーマットをバイナリデータ処理で判別

フローサービスで処理を行う場合、文字列データや数値データなどを扱うことが多いと思いますが、バイナリデータを処理することもできます。バイナリデータを扱う処理の一例として、画像ファイルのヘッダ部分を利用して画像フォーマットの判別をしてみたいと思います。

画像ファイルのフォーマットの判別

画像ファイルの先頭には、そのファイルがどのような種類の画像フォーマットであるかを指し示すデータが含まれています。この先頭部分をチェックすることによって、画像フォーマットを判別することができます。
各画像フォーマットごとの先頭データの内容は次のようになります。
フォーマット先頭
JPEGFF D8
PNG89 50 4E 47
GIF47 49 46 38

画像ファイルの準備

imagesフォルダー配下に画像ファイルとテキストファイルを用意しておきます。
拡張子を偽装したファイルが正しく判別されるかどうかも確認したいので、テキストファイルの拡張子をjpgにした「text.jpg」ファイルも用意しておきます。
yohmi1.png

フローの作成

では、フローを作成します。
実行結果として、次の形式のテキストを出力します。
ファイルパス : フォーマット文字列
※フォーマット文字列は、それぞれ「JPEG」、「PNG」、「GIF」とし、それ以外は「other」とします。

1. ファイルの読み込み

FileGetコンポーネントでimagesフォルダー配下のファイルを読み込んで、ループを開始します。今回は読み込んだファイルをバイナリ処理するため、出力ストリームのストリーム型はBinaryを指定します。
あとはMapperコンポーネントでの処理になります。
yohmi2.png

2. ヘッダから判別データの切り出し

JPEGの判定用に、LeftB関数でバイナリデータの先頭から2バイトを切り出します。
同様にPNGとGIFの判定用に、先頭から4バイトを切り出します。

yohmi3.png


3. フォーマット毎のバイト列と比較

比較用にフォーマット毎のバイト列をConstB関数で用意します。例えば、JPEGの場合はConstB関数のデータプロパティに「FF D8」を指定します。
このバイト列を、手順2で切り出したバイト列と比較します。

yohmi4.png


4. ファイル形式のインデックス値に変換

SelectIndex関数でフォーマットのインデックス値に変換します。
それぞれのインデックス値は以下のようにします。
1:JPEG
2:PNG
3:GIF
4:上記以外

yohmi5.png


5. インデックス値をフォーマット文字列に変換

Table関数でインデックス値をフォーマット文字列に変換します。

yohmi6.png


6. フォーマット文字列をフロー変数にマッピング

フロー変数「format」を用意して、フォーマット文字列をマッピングします。

yohmi7.png


7. 結果を出力

これでフロー変数「format」にフォーマット文字列が代入された状態になりました。この後は、このフロー変数の値をSwitchコンポーネントなどで判定して処理を分岐していくような使い方が考えられますが、ここではフォーマットの判別結果を確認するために、Mapperコンポーネントで確認用のテキストを出力します。
Embed関数を使用して文字列を整形し、出力ストリームに渡します。

yohmi8.png


以上でフローは完成です。実行した結果は次のようになります。

yohmi9.png

それぞれのファイルの形式が正しく判別されています。

このようにしてフローで画像のフォーマットを判定できるようになると、ImageConverterコンポーネントで画像サイズや画像フォーマットの変換ができるようになります。
次回はマッパー関数の代わりにJavaInterpreterコンポーネントを使用して、画像フォーマットの判別をしてみたいと思います。
この記事は役に立ちましたか?
1人中1人がこの記事が役に立ったと言っています

他のキーワードで検索する