無需完整文件處理即可取得圖片尺寸
在影像處理中,常常需要在進一步處理之前確定影像的尺寸。然而,獲取圖像尺寸通常需要將整個圖像載入到記憶體中。
對於記憶體資源至關重要的場景,需要一種更有效率的方法。本文探討了一種無需讀取整個檔案即可取得影像尺寸的方法,僅使用標準類別庫。
解碼影像頭部資訊
影像格式在其頭部資訊中編碼了重要的資訊。透過解析這些頭部信息,我們可以提取尺寸而無需消耗整個文件。不同的影像格式使用不同的頭部訊息,每個頭部訊息都有其自身的結構。例如,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中文網其他相關文章!