首頁 > 後端開發 > C++ > 如何在不加載整個文件的情況下獲取圖像尺寸?

如何在不加載整個文件的情況下獲取圖像尺寸?

Susan Sarandon
發布: 2025-01-10 12:09:51
原創
994 人瀏覽過

How Can I Get Image Dimensions Without Loading the Entire File?

無需完整文件處理即可取得圖片尺寸

在影像處理中,常常需要在進一步處理之前確定影像的尺寸。然而,獲取圖像尺寸通常需要將整個圖像載入到記憶體中。

對於記憶體資源至關重要的場景,需要一種更有效率的方法。本文探討了一種無需讀取整個檔案即可取得影像尺寸的方法,僅使用標準類別庫。

解碼影像頭部資訊

影像格式在其頭部資訊中編碼了重要的資訊。透過解析這些頭部信息,我們可以提取尺寸而無需消耗整個文件。不同的影像格式使用不同的頭部訊息,每個頭部訊息都有其自身的結構。例如,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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板