PNG به JPEG بدون پسزمینهٔ سیاه
JPEG سه کانال رنگی ذخیره میکند و کانال آلفا ندارد، بنابراین شفافیت باید در جریان تبدیل به رنگی واقعی تبدیل شود. مبدلهایی که هرگز نمیپرسند، پیکسلهای شفاف را روی هر چیزی که زیرشان در حافظه بود رها میکنند، که صفر است — یعنی سیاه. تنظیم پسزمینه روی #ffffff بخشهای شفاف را پیش از آنکه چیزی کدگذاری شود سفید میکند، که همان چیزی است که لوگویی روی صفحهٔ سفید نیاز دارد.
هر PNG، از جمله ۱۶ بیتی، پالتدار و اینترلیس. در همین برگه خوانده میشود و هرگز به جایی ارسال نمیشود.
یک PNG شفاف زیر پیکسلهای شفافش مقادیر رنگی دارد، و آنها اغلب سیاهاند؛ کانال آلفا تنها چیزی بود که پنهانشان میکرد.
پسزمینه را با هر چیزی که JPEG روی آن قرار میگیرد هماهنگ کنید. سفید برای سند، و رنگ صفحه برای بنر وب، وگرنه لبهها دیده میشوند.
لبههای نرم با رنگی که انتخاب میکنید آمیخته میشوند، بنابراین تغییر نظر در آینده یعنی تبدیل دوبارهٔ PNG اصلی، نه ویرایش JPEG.
چگونگی کار
مراحل انجام کار
- فایل انتخابشده را در همین برگه بخوانید و امضای هشتبایتی 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 ساده نوشته میشود، بنابراین تصویری با گاموت گسترده بیجانتر از اصل درمیآید.
پرسشهای رایج
آیا میتوانم انتخاب کنم کدام رنگ جای شفافیت را بگیرد؟
سفید به کار میرود، چون همان چیزی است که یک سند، یک ایمیل و بیشتر صفحههای وب روی آن قرار میگیرند. اگر تصویر قرار است روی پسزمینهای تیره بنشیند، ابتدا آن را در یک ویرایشگر روی همان رنگ تخت کنید — JPEG اصلاً کانال آلفا ندارد، بنابراین این انتخاب باید پیش از تغییر قالب انجام شود.
آیا PNG را هم باید نگه دارم؟
بله، اگر ممکن است دوباره به شفافیت نیاز شود. تختکردن برگشتناپذیر است: وقتی پسزمینه سفید شد، دیگر نمیتوان بدون بریدن سوژه با دست آن را شفاف کرد. یک نسخهٔ کپی را تبدیل کنید و نسخهٔ اصلی را بهعنوان مرجع نگه دارید.
منابع
- 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.