LoginSignup
2
1

More than 3 years have passed since last update.

JPEGファイルのプログレッシブ判定

Last updated at Posted at 2017-12-01

まえがき

プログレッシブJPEGが読めない端末(ガラケー時代の端末です)に対応するため、Gitの全ファイルをスキャンすることにした…のはいいんですが、既存の方法だと自動化に不向き or 判定上はセーフだけど読めない謎JPEGがある 等の理由でこれだっ!って物がなかったので自作することに

しくみ

さらりと調べた結果、SOFヘッダ部に画像のスキャンモードが格納されていることがわかりました
(参考:http://www.setsuki.com/hsp/ext/jpg.htm)
なので楽観的にプログレッシブフレームが存在するかどうか、つまりJPEGファイル中に0xFFC2が存在するかどうかで判定をすることにしました
本来はちゃんと検出位置がSOFヘッダなのかどうか考慮しなければいけないハズですが、今のところ誤検出がないので改修してません
また、ベースラインとプログレッシブ以外にもシーケンシャル、ロスレスとありますが今回はこの二つはそもそも使わないだろうという事で対象外としています

Source

        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に通知する運用をしています
ホントは変換までしてもよかったんですがめんどくさい技量不足故断念

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1