#まえがき
プログレッシブJPEGが読めない端末(ガラケー時代の端末です)に対応するため、Gitの全ファイルをスキャンすることにした…のはいいんですが、既存の方法だと自動化に不向き or 判定上はセーフだけど読めない謎JPEGがある 等の理由でこれだっ!って物がなかったので自作することに
#しくみ
さらりと調べた結果、SOFヘッダ部に画像のスキャンモードが格納されていることがわかりました
(参考:http://www.setsuki.com/hsp/ext/jpg.htm)
なので楽観的にプログレッシブフレームが存在するかどうか、つまりJPEGファイル中に0xFFC2が存在するかどうかで判定をすることにしました
本来はちゃんと検出位置がSOFヘッダなのかどうか考慮しなければいけないハズですが、今のところ誤検出がないので改修してません
また、ベースラインとプログレッシブ以外にもシーケンシャル、ロスレスとありますが今回はこの二つはそもそも使わないだろうという事で対象外としています
#Source
https://github.com/fumitti/JpegProgressiveChecker
private const int Bufsize = 4096;//?
static async Task<bool> IsJpegProgressive(string filePath)
{
using (var stream = File.OpenRead(filePath))
{
var sofFlag = false;
byte[] buf = new byte[Bufsize];
while (true)
{
var read = await stream.ReadAsync(buf, 0, Bufsize);
foreach (var b in buf)
{
if (sofFlag)
{
if (b == 0xC2)
return true;
sofFlag = false;
}
if (b == 0xFF)
sofFlag = true;
}
if (read <= 0)
break;
};
}
return false;
}
C#初心者な頃にゴリ押しで書いたので汚いです(言い訳)
あとはこれをGithub連携させたJenkinsでキックさせ、もし引っかかったらSlackに通知する運用をしています
ホントは変換までしてもよかったんですがめんどくさい技量不足故断念