C#でJpegとPNGファイルから幅と高さを取得

C# コンピュータ
C#
多数の画像ファイルから幅と高さを取得する必要があり、なるべく短い時間で取得できるように試作してみました。

ソースコード

public class Program1
{
    static public void Main()
    {
        var buf = new byte[0xffff];
        int width = 0;
        int height = 0;

        string path = @"F:\csharp\ImgView2\00201.png";
        path = @"F:\csharp\ImgView2\00201.png";
        using var fs = new FileStream(path, FileMode.Open, FileAccess.Read);

        fs.Read(buf, 0, buf.Length);

        // PNG
        if (buf.Take(8).SequenceEqual(new byte[]{0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A,}))
        {
            var w = buf.Skip(8+8+0).Take(4).Reverse().ToArray();
            var h = buf.Skip(8+8+4).Take(4).Reverse().ToArray();
            width = BitConverter.ToInt32(w);
            height = BitConverter.ToInt32(h);
            Console.WriteLine($"PNG: Width:{width} Height:{height}");
        }

        // JPEG
        if (buf.Take(2).SequenceEqual(new byte[] { 0xff, 0xd8, }))
        {
            var i = buf.Select((x,i) => new { index = i, value = buf.Skip(i).Take(2)})
                .Where(x => x.value.SequenceEqual(new byte[] { 0xff, 0xc0,} ))
                .Select(x => x.index)
                .DefaultIfEmpty(-1)
                .First();
            if (i >= 0)
            {
                var w = buf.Skip(i+2+5).Take(2).Reverse().ToArray();    
                var h = buf.Skip(i+2+3).Take(2).Reverse().ToArray();    
                width = (int)BitConverter.ToInt16(w);
                height = (int)BitConverter.ToInt16(h);
                Console.WriteLine($"JPEG: Width:{width} Height:{height}");
            }
        }
    }
}

結果

PNG: Width:846 Height:1200
いろいろ適当ですが一応数値を取得できました。
BitConverter()でbyte配列から数値に変換していますが、リトルエンディアンで決め打ちしています。
byte[]配列をLINQで操作できることを初めて知りましたが結構便利です。
追記
画像ファイルの中で幅と高さの数値が書き込まれた場所を決め打ちして呼び出しています。特定の画像形式でテストを沢山すれば実用的なプログラムを組めるかもしれませんが、大変なので誰かが作ってくれたライブラリを利用しましょう。
Magick.net
C#でMagick.NETを使って画像ファイルの幅と高さを取得する。
画像ファイルの幅と高さを取得する方法として、Sysmte.Drawing.Bitmapのオブジェクトを生成し、プロパティのWidthやHeightを参照すれば良いのですが、ファイルサイズが大きな画像ファイルが多量にある場合、毎回Bitmap...

コメント