فرمت های تصویر: GIF

اگرچه GIF (فرمت تبادل گرافیکی) در وب مدرن چندان مفید نیست، مقدمه ای محکم برای مفاهیم اصلی رمزگذاری تصویر فراهم می کند.

GIF را می توان به عنوان یک پوشش برای داده های تصویر در نظر گرفت. این یک درگاه دید دارد که به نوعی «صفحه نمایش منطقی» نامیده می‌شود، که فریم‌های جداگانه داده‌های تصویر به آن کشیده می‌شوند - کمی شبیه به لایه‌های یک سند فتوشاپ. اینگونه است که GIF از انیمیشن فلیپ بوک مانند خود پشتیبانی می کند: یک فریم منفرد به صفحه نمایش منطقی کشیده می شود، سپس با دیگری جایگزین می شود و سپس فریم دیگری جایگزین می شود. البته، این تمایز زمانی که با یک GIF ایستا سروکار داریم که از یک فریم منفرد به سمت صفحه نمایش منطقی کشیده شده است، مهم نیست.

اگر کنجکاو هستید، GIF از یک روش فشرده‌سازی داده‌های بدون تلفات استفاده می‌کند - نوعی از الگوریتم " Lempel–Ziv–Welch ". جزئیات دقیق‌تر نحوه عملکرد این الگوریتم بیش از آن چیزی است که ما در اینجا به آن نیاز داریم، اما در سطح بالایی است: کمی شبیه به جاوا اسکریپت "Uglifying" عمل می‌کند، جایی که رشته‌های تکراری کاراکترها در سراسر فایل در نوعی فرهنگ لغت داخلی ذخیره می‌شوند. ، بنابراین می توان آنها را به جای تکرار هر بار که ظاهر می شوند ارجاع داد.

تجسم مرجع گیف با استفاده از یک شبکه چهار در چهار.

مسلماً، الگوریتم به سادگی یک رنگ به عدد نیست . مجدداً از جدول کدهای رنگی تولید شده عبور می کند تا دنباله های مکرر رنگ های پیکسل را بیابد و یک جدول دوم از کدهای قابل ارجاع ایجاد می کند. با این حال، در هیچ نقطه ای هیچ داده تصویری از بین نمی رود - فقط به گونه ای مرتب شده و سازماندهی مجدد می شود که بتوان بدون تغییر اساسی آن را خواند.

در حالی که GIF از نظر فنی از فشرده‌سازی بدون تلفات استفاده می‌کند، یک محدودیت عمده دارد که به شدت بر کیفیت تصاویر تأثیر می‌گذارد: ذخیره یک تصویر به‌عنوان یک GIF همیشه منجر به کاهش وفاداری می‌شود، مگر اینکه تصویر از قبل از ۲۵۶ رنگ یا کمتر استفاده کند.

هر فریمی که روی صفحه منطقی GIF کشیده می‌شود، تنها می‌تواند حداکثر ۲۵۶ رنگ داشته باشد. GIF همچنین از "شفافیت شاخص" پشتیبانی می کند، جایی که یک پیکسل شفاف به شاخص یک "رنگ" شفاف در جدول رنگ اشاره می کند.

عمل کاهش دامنه ای از مقادیر به مجموعه ای کوچکتر و تقریبی از مقادیر خروجی، کوانتیزه کردن نامیده می شود، اصطلاحی که هنگام یادگیری در مورد رمزگذاری تصویر بسیار خواهید دید. نتایج این کوانتیزاسیون پالت معمولاً واضح است:

نمونه گیف استاتیک

برای درک بهتر این فرآیند، به شبکه تصویر شطرنجی که توانستید از توضیحات من دوباره ایجاد کنید، فکر کنید.

سه جعبه آبی افقی به دنبال آن یک کادر قرمز

این بار، کمی جزئیات بیشتر به آن تصویر اصلی اضافه کنید: چند پیکسل دیگر که یکی از آنها کمی تیره‌تر از آبی است:

جعبه‌های افقی آبی تا قرمز در پیکربندی دو در چهار، با یک کادر آبی تیره‌تر از بقیه.

بدون هر گونه فشرده سازی - به اصطلاح - می توانید این شبکه را به صورت زیر توصیف کنید:

ردیف یک، ستون یک #0000FF است. ردیف یک، ستون دو #0000FF است. ردیف یک، ستون سه #0000FF است. ردیف یک، ستون چهار #FF0000 است. ردیف دو، ستون یک #0000FF است. سطر دو، ستون دو #000085 است. سطر دو، ستون سه #0000FF است. سطر دو، ستون چهار #FF0000 است.

با استفاده از چیزی شبیه به فشرده سازی داده های بدون اتلاف GIF و نمایه سازی رنگ، ممکن است آن را به صورت زیر توصیف کنید:

A: #0000FF، B: #FF0000، C: #000085. ردیف یک، ستون های یک تا سه A. ردیف یک، ستون چهار B. ردیف دو، ستون یک A. ردیف دو، ستون دو C. ردیف دو، ستون سه A. ردیف دو، ستون چهار B است.

این می‌تواند توضیحات پیکسل به پیکسل را در چند مکان متراکم کند ("ستون‌های یک تا سه هستند...")، و چند کاراکتر را با تعریف رنگ‌های تکراری در یک فرهنگ لغت، به نوعی، در جلو ذخیره می‌کند. هیچ تغییری در وفاداری بصری وجود ندارد. اطلاعات بدون از دست دادن فشرده شده است.

کادرهای افقی آبی تا قرمز، با یک پیکسل تیره در ابعاد 2x2.

همانطور که می بینید، با این حال، تک پیکسل آبی تیره تأثیر بزرگی بر اندازه رمزگذاری ما دارد. اگر بخواهم خودم را به یک پالت رنگ کوانتیزه محدود کنم، می توان آن را بسیار کاهش داد:

A: #0000FF، B: #FF0000. ردیف یک، ستون های یک تا سه A. ردیف یک، ستون چهار B. ردیف دو، ستون های یک تا سه A. ردیف دو، ستون چهار B است.

نتیجه نهایی تاسف بار آن بایت های ذخیره شده این است که شما کامل بودن پیکسل را از دست داده اید.

جعبه های افقی یکنواخت آبی تا قرمز.

البته، شما، موتور رندر، این را نمی‌دانید—جزئیات پیکسل آبی تیره‌تر از نحوه کدگذاری تصویر منبع خود حذف شد. شما تصویر را دقیقاً همانطور که من آن را رمزگذاری کرده ام، بر اساس درک مشترک ما از رنگ هایی که در دست داریم، رندر کرده اید.

حال، در این مثال اغراق‌آمیز، کاهش سه رنگ به دو، تفاوت واضحی در کیفیت ایجاد می‌کند. در یک تصویر بزرگتر و دقیق تر، ممکن است جلوه ها کاملاً قابل توجه نباشند، اما همچنان قابل مشاهده هستند.

هنگامی که به عنوان یک GIF کدگذاری می شود، شیب های ظریف مانند سایه ها خالدار می شوند و پیکسل های جداگانه از محیط اطراف خود برجسته می شوند:

گل های صورتی در زمینه سبز.

در عمل، ترکیب فشرده سازی بدون اتلاف و کوانتیزاسیون پالت به این معنی است که GIF در توسعه وب مدرن چندان مفید نیست. فشرده سازی بدون اتلاف به اندازه کافی برای کاهش اندازه فایل انجام نمی شود و پالت کاهش یافته به معنای کاهش واضح کیفیت است.

در نهایت، GIF تنها یک فرمت کارآمد برای رمزگذاری تصاویر ساده است که قبلاً از پالت‌های رنگی محدود، لبه‌های سخت به جای ضد aliasing، و رنگ‌های ثابت به جای گرادیان استفاده می‌کنند - همه موارد استفاده می‌کنند که در فرمت‌های دیگر به مراتب بهتر ارائه می‌شوند. PNG کوچکتر و برجسته‌تر اغلب برای تصاویر شطرنجی انتخاب بهتری است، اگرچه هر دو از نظر اندازه فایل و وفاداری بصری برای موارد استفاده مانند نمادها یا هنرهای خطی، که در آن وکتور می‌درخشد، بسیار پایین‌تر از SVG هستند. رایج‌ترین مورد استفاده مدرن برای GIF انیمیشن است، اما فرمت‌های ویدئویی مدرن بسیار کارآمدتر و در دسترس‌تر برای خدمت به این هدف وجود دارد.