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>
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>
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>
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!