بررسی دقیق مراحل رمزگشایی فایلهای PNG؛ از Chunkها تا فیلترینگ و دی کامپرس — Each step of decoding a PNG (2022)
خلاصه
این مقاله به صورت گامبهگام نحوه رمزگشایی یک فایل PNG را از سطح بایتها بررسی میکند. درک این ساختار برای توسعهدهندگانی که با پردازش تصویر یا فرمتهای فایل سر و کار دارند بسیار مفید و کاربردی است.
فرمت PNG یکی از رایجترین فرمتهای ذخیرهسازی تصاویر است که سالهاست در وب و نرمافزارها از آن استفاده میکنیم. در این مقاله به بررسی فرآیند کامل رمزگشایی (Decoding) یک فایل PNG از ابتدا تا انتها میپردازیم تا ببینیم چطور بایتهای خام به یک تصویر روی صفحه تبدیل میشوند.
ساختار Chunkها در PNG
فایلهای PNG به صورت مجموعهای از بلاکها به نام Chunk ذخیره میشوند. هر Chunk شامل موارد زیر است:
- طول داده (۴ بایت)
- نام Chunk یا همان نوع آن (۴ بایت)
- داده اصلی
- کد صحتسنجی CRC
اکثر این Chunkها شامل متدادههای تصویر هستند، اما دادههای اصلی تصویر در Chunkهایی با نام IDAT قرار دارند. بزرگ یا کوچک بودن حروف نام هر Chunk مشخص میکند که اگر برنامهای با یک Chunk ناشناخته مواجه شد، چگونه باید با آن برخورد کند.
استخراج و استریم دادهها
برای شروع رمزگشایی، تمام Chunkهای IDAT را پیدا کرده و دادههای آنها را به یکدیگر میچسبانیم. گاهی تصویر فقط یک Chunk دارد و گاهی به دلیل محدودیت اندازه یا مکانیزمهای استریم، شامل چند Chunk متوالی است. اگر این دادههای فشردهسازیشده را به صورت خام نگاه کنیم، شبیه به نویز تصادفی به نظر میرسند که نشاندهنده کارایی بالای الگوریتم فشردهسازی است.
دیکامپرس کردن با zlib
دادههای موجود در بخش IDAT با استفاده از الگوریتم استاندارد zlib فشرده شدهاند (هیچ مکانیزم فشردهسازی عجیبی مختص تصاویر وجود ندارد). پس از خارج کردن دادهها از حالت فشرده، تصویر همچنان کجوجوله و با رنگهای عجیب به نظر میرسد؛ دلیل آن استفاده از فیلترهای خطی پیش از فشردهسازی است.
فیلترینگ و رفع فیلتر (Defiltering)
فیلترها به خودی خود حجم فایل را کم نمیکنند، بلکه دادهها را به شکلی درآورند که الگوریتم zlib بتواند آنها را بسیار بهتر فشرده کند. در این مرحله، با خواندن بایت فیلتر در ابتدای هر سطر، فیلتر را معکوس کرده تا پیکسلهای واقعی به دست بیایند.
اینترلایسینگ (Interlacing)
در فرمت PNG امکانی وجود دارد که تصویر به ۷ زیرمجموعه مختلف تقسیم شود (موسوم به الگوی Adam7). این قابلیت به تصویر اجازه میدهد که هنگام بارگذاری در شبکه، ابتدا نسخه تار و کلی آن نمایش داده شود و به مرور جزئیات بیشتر بارگذاری گردد.
حاشیههای بحث در هکرنیوز
در بحثهای هکرنیوز، توسعهدهندگان به نکات جالبی اشاره کردند:
- نوشتن یک رمزگشای PNG از صفر (مثلاً با زبان Rust) یک پروژه جذاب آخر هفته برای یادگیری عمیق ساختار بایتهاست.
- این بحث پیش آمد که تمایز بین Chunkهای حیاتی (Critical) و جانبی (Ancillary) گاهی غیرشهودی به نظر میرسد.
- عدهای پیشنهاد دادند که داشتن یک وبسایت مرجع با مقالاتی مشابه برای فرمتهای فایل دیگر چقدر میتواند مفید باشد.
این مطلب بهصورت کاملاً خودکار و با هوش مصنوعی از مقالهٔ اصلی و بحث هکرنیوز تهیه شده و ممکن است خطا داشته باشد. حقوق مطلب اصلی متعلق به نویسندهٔ آن است. قوانین و گزارش مشکل