完全なファイル処理を行わずに画像のサイズを取得します
画像処理では、多くの場合、さらに処理する前に画像のサイズを決定する必要があります。ただし、画像の寸法を取得するには、通常、画像全体をメモリにロードする必要があります。
メモリ リソースが重要なシナリオでは、より効率的なアプローチが必要です。この記事では、ファイル全体を読み取らずに、標準クラス ライブラリを使用するだけで画像の寸法を取得する方法を検討します。
画像ヘッダー情報をデコードします
画像形式は、ヘッダー情報に重要な情報をエンコードします。これらのヘッダーを解析することで、ファイル全体を消費することなくディメンションを抽出できます。画像形式が異なれば、使用するヘッダー情報も異なり、それぞれ独自の構造を持ちます。たとえば、JPEG ヘッダーには一連のタグが含まれていますが、PNG ヘッダーにはリトル エンディアンの整数が使用されます。
実装方法
まず、ヘッダーの「マジック ビット」を、対応するヘッダーを解析する関数にマップする辞書 (imageFormatDecoders) を作成します。これらの関数は、ストリームから幅と高さの情報を抽出します。
<code class="language-csharp">private static Dictionary<byte[], Func<BinaryReader, Size>> imageFormatDecoders = new Dictionary<byte[], Func<BinaryReader, Size>>() { { new byte[]{ 0x42, 0x4D }, DecodeBitmap}, { new byte[]{ 0x47, 0x49, 0x46, 0x38, 0x37, 0x61 }, DecodeGif }, { new byte[]{ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 }, DecodeGif }, { new byte[]{ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }, DecodePng }, { new byte[]{ 0xff, 0xd8 }, DecodeJfif }, };</code>
画像の寸法を取得するには、BinaryReader オブジェクトを作成し、GetDimensions メソッドを呼び出します。このメソッドはヘッダー マジック ビットを反復処理し、imageFormatDecoders ディクショナリ内のキーと比較し、一致するものが見つかった場合は、サイズ抽出を適切な関数に委譲します。
<code class="language-csharp">public static Size GetDimensions(string path) { using (BinaryReader binaryReader = new BinaryReader(File.OpenRead(path))) { try { return GetDimensions(binaryReader); } catch (ArgumentException e) { if (e.Message.StartsWith(errorMessage)) { throw new ArgumentException(errorMessage, "path", e); } else { throw e; } } } }</code>
使用例
ライブラリをプロジェクトに統合した後、画像の寸法を取得するのは簡単です:
<code class="language-csharp">string imagePath = "/path_to_image/image.png"; Size dimensions = ImageHelper.GetDimensions(imagePath);</code>
概要
このソリューションは、利用可能な画像形式デコーダーを利用し、さまざまな画像ファイル タイプで動作します。これは、プラットフォームに依存しない画像サイズの取得方法を提供します。これは、リソースが限られた環境で特に価値があります。
以上がファイル全体をロードせずに画像のサイズを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。