Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Mendapatkan Dimensi Imej Tanpa Memuatkan Keseluruhan Fail?

Bagaimanakah Saya Boleh Mendapatkan Dimensi Imej Tanpa Memuatkan Keseluruhan Fail?

Susan Sarandon
Lepaskan: 2025-01-10 12:09:51
asal
1042 orang telah melayarinya

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

Dapatkan dimensi imej tanpa pemprosesan fail penuh

Dalam pemprosesan imej, selalunya perlu menentukan saiz imej sebelum pemprosesan selanjutnya. Walau bagaimanapun, mendapatkan dimensi imej biasanya memerlukan memuatkan keseluruhan imej ke dalam memori.

Untuk senario di mana sumber memori adalah kritikal, pendekatan yang lebih cekap diperlukan. Artikel ini meneroka cara untuk mendapatkan dimensi imej tanpa membaca keseluruhan fail, hanya menggunakan perpustakaan kelas standard.

Nyahkod maklumat pengepala imej

Format imej mengekod maklumat penting dalam maklumat pengepalanya. Dengan menghuraikan pengepala ini, kami boleh mengekstrak dimensi tanpa menggunakan keseluruhan fail. Format imej yang berbeza menggunakan maklumat pengepala yang berbeza, setiap satu dengan strukturnya sendiri. Sebagai contoh, pengepala JPEG mengandungi jujukan teg, manakala pengepala PNG menggunakan integer kecil-endian.

Kaedah pelaksanaan

Kami mula-mula mencipta kamus (imageFormatDecoders) yang memetakan pengepala "bit ajaib" kepada fungsi yang menghuraikan pengepala yang sepadan. Fungsi ini mengekstrak maklumat lebar dan ketinggian daripada aliran.

<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>
Salin selepas log masuk

Untuk mendapatkan dimensi imej, kami mencipta objek BinaryReader dan memanggil kaedah GetDimensions. Kaedah ini berulang ke atas bit ajaib pengepala, membandingkannya dengan kekunci dalam kamus imageFormatDecoder, dan jika padanan ditemui, wakilkan pengekstrakan saiz kepada fungsi yang sesuai.

<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>
Salin selepas log masuk

Contoh penggunaan

Selepas menyepadukan perpustakaan ke dalam projek anda, mendapatkan semula dimensi imej adalah mudah:

<code class="language-csharp">string imagePath = "/path_to_image/image.png";
Size dimensions = ImageHelper.GetDimensions(imagePath);</code>
Salin selepas log masuk

Ringkasan

Penyelesaian ini menggunakan penyahkod format imej yang tersedia dan berfungsi dengan pelbagai jenis fail imej. Ia menyediakan kaedah bebas platform untuk mendapatkan semula saiz imej, yang amat berharga dalam persekitaran terhad sumber.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mendapatkan Dimensi Imej Tanpa Memuatkan Keseluruhan Fail?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan