کوچککردن یک PNG با تبدیل آن به JPEG
PNG بیاتلاف است، بنابراین عکسی که به این قالب ذخیره شود تمام جزئیات حسگر را که هیچکس نمیبیند نگه میدارد و بهای کاملش را میپردازد. JPEG جزئیات فرکانسبالایی را که چشم در دیدنش از همه ضعیفتر است کنار میگذارد، که در یک عکس معمولاً با کیفیت ۶۰ فایلی پنج تا بیست برابر کوچکتر، بدون تغییر محسوس، میدهد. در گرافیکهای تخت، اسکرینشاتها و طرحهای خطی صرفهجویی بسیار کمتر است و میتواند منفی باشد.
هر PNG، از جمله ۱۶ بیتی، پالتدار و اینترلیس. در همین برگه خوانده میشود و هرگز به جایی ارسال نمیشود.
کیفیت ۶۰ با زیرنمونهبرداری ۴:۲:۰ نقطهٔ بهینهٔ معمول برای پیوست است: بهوضوح کوچکتر، و افت کیفیت فقط وقتی بزرگنمایی کنید دیده میشود.
اسکرینشاتهای متن بهصورت JPEG بد فشرده میشوند و دور حروف حاشیههای رنگی آشکار پیدا میکنند، پس آنها را PNG نگه دارید و بهجایش برش بزنید.
تبدیل JPEGای که خودش از یک JPEG آمده هر بار کمی بیشتر از دست میدهد، بنابراین همیشه از PNG اصلی شروع کنید، نه از خروجی قبلی.
چگونگی کار
مراحل انجام کار
- فایل انتخابشده را در همین برگه بخوانید و امضای هشتبایتی PNG را بررسی کنید، سپس زنجیرهٔ چانکها را برای یافتن IHDR، PLTE، tRNS، IDAT و pHYs پیمایش کنید.
- چانکهای IDAT بههمپیوسته را بهعنوان یک جریان zlib، با DecompressionStream خود مرورگر بهجای یک کتابخانهٔ inflate همراهشده، از حالت فشرده خارج کنید.
- فیلتر هر ردیف — None، Sub، Up، Average یا Paeth — را از بالا به پایین تصویر برگردانید، زیرا هر ردیف از ردیف بالای خود و پیکسل سمت چپش پیشبینی میشود.
- نمونهها را به RGBA هشتبیتی بسط دهید، فارغ از نوع رنگ و عمق بیت فایل، و اگر PNG اینترلیس باشد ابتدا هفت پاس را دوباره سرهم کنید.
- هر پیکسل را با استفاده از آلفای آن روی رنگ پسزمینهٔ انتخابی ترکیب کنید، تا پیکسل شفاف به همان رنگ تبدیل شود، نه به هر چیزی که زیرش بود.
- با ضرایب تمامدامنهٔ BT.601 که JFIF مشخص میکند به Y، Cb و Cr تبدیل کنید و اگر ۴:۲:۰ در کار است، وضوح دو صفحهٔ رنگی را با فیلتر جعبهای نصف کنید.
- تبدیل کسینوسی گسستهٔ هر بلوک ۸×۸ را بگیرید، بر جدول کوانتیزاسیون پیوست K که برای کیفیت انتخابی مقیاس شده تقسیم کنید و گرد کنید.
- ضرایب را با جدولهای پیوست K هافمنکد کنید، پس از هر بایت 0xFF واقعی یک بایت صفر درج کنید، و قطعههای نشانگر JFIF را دور نتیجه بنویسید.
فرضها
- شفافیت پیش از هر اتفاق دیگری روی رنگ انتخابشده تخت میشود و آمیزش در sRGB انجام میشود، نه در نور خطی. این از نظر فیزیکی درست نیست — یک پیکسل نیمهشفاف چند درصد تیرهتر از آنچه باید درمیآید — اما همان کاری است که بوم مرورگر و هر ویرایشگر تصویری میکند، بنابراین JPEG با PNGای که داشتید میدیدید مطابقت دارد.
- کیفیت همان مقیاس پیوست K مشخصات JPEG است، نه مقیاس مرورگر. همین عدد در اینجا در هر مرورگری بایتبهبایت همان فایل را میدهد، اما با «کیفیت ۸۲» در فتوشاپ یا GIMP مطابقت نخواهد داشت، زیرا هر کدام از آنها از جدولهای متفاوتی شروع میکنند.
- زیر کیفیت ۹۰، دو کانال رنگی در هر جهت با نصف وضوح ذخیره میشوند. روی عکس این نامرئی است؛ روی متن اشباع یا خطوط رنگی نازک بهصورت حاشیهٔ رنگی دیده میشود، و به همین دلیل میتوان این تنظیم را به ۴:۴:۴ اجبار کرد.
- یک PNG ۱۶ بیتی با نگهداشتن بایت بالای هر نمونه به هشت بیت کاهش مییابد. JPEG قالبی هشتبیتی است، بنابراین بایت پایین جایی برای رفتن ندارد.
- پروفایلهای رنگی منتقل نمیشوند. چانک iCCP، gAMA یا cHRM در PNG نادیده گرفته میشود و نتیجه بهصورت sRGB ساده نوشته میشود، بنابراین تصویری با گاموت گسترده بیجانتر از اصل درمیآید.
پرسشهای رایج
ارائهدهندگان ایمیل واقعاً چه محدودیت اندازهای اعمال میکنند؟
Gmail و Outlook هر دو پیام را در حدود ۲۵ مگابایت، شامل سربار کدگذاری، محدود میکنند که تقریباً ۲۰ مگابایت پیوست واقعی است. سرورهای ایمیل شرکتی اغلب بسیار سختگیرترند — ۱۰ مگابایت رایج است — و معمولاً پیام را پس از ارسال برگشت میزنند، نه اینکه از ابتدا رد کنند.
تغییر اندازه بهتر است یا فشردهسازی شدیدتر؟
اول اندازه را تغییر دهید. عکس ۴۰۰۰ پیکسلی که روی تلفن دیده میشود به هر حال کوچک میشود، پس آن پیکسلها بایت خرج میکنند و چیزی پس نمیدهند. کاهش به عرض ۱۶۰۰ پیکسل با کیفیت ۸۰ معمولاً بهتر از حفظ ابعاد و پایینآوردن کیفیت تا ۴۰ است، که آرتیفکت بلوکی آشکاری ایجاد میکند.
منابع
- Portable Network Graphics (PNG) Specification (Third Edition)
- Recommendation T.81: Information technology – Digital compression and coding of continuous-tone still images – Requirements and guidelines
- Recommendation T.871: Information technology – Digital compression and coding of continuous-tone still images: JPEG File Interchange Format (JFIF)
- RFC 1950: ZLIB Compressed Data Format Specification version 3.3
روش کامل، مثال محاسبهشده و همهٔ فرضهای این نتیجه در این صفحه آمده است: تبدیل PNG به JPEG.