تقریباً همهی ما افت کیفیت عکسهای ذخیرهشدهمان را تجربه کردهایم. عکسی را در یکی از نرمافزارهای ویرایش باز میکنید، کمی نور و رنگش را تغییر میدهید، خروجی میگیرید و فایل را میبندید. چند روز بعد احساس میکنید کنتراست تصویر جای کار دارد؛ دوباره همان فایل را باز میکنید، تغییراتی میدهید و دکمه Save را میزنید.
اگر چرخه ادیت و ذخیره را چندین بار تکرار کنید، متوجه میشوید که تصویر دیگر دقیقاً شبیه روز اولش نیست. لبههای تیز تصویر هاله پیدا میکنند، جزئیات ریز محو میشوند و مربعهای مات و مزاحمی در بخشهای مختلف عکس خودنمایی میکنند.
خلاصه صوتی
خلاصه صوتی، ساختهشده با هوش مصنوعی
بگذارید ابتدا سوءتفاهم رایجی را برطرف کنیم. صرف کپیکردن یک فایل JPEG، کیفیتش را پایین نمیآورد. اگر عکسی را از پوشهای به پوشهی دیگر کپی کنید یا روی فلشمموری بریزید، بیتهای دیجیتال فایل، دقیقاً و بدون تغییر جابهجا میشوند.
افت کیفیت زمانی رخ میدهد که یک فایل JPEG بهصورت تصویر قابلنمایش باز شود، تصویر حاصل تغییر کند یا دوباره برای ذخیرهسازی به JPEG تبدیل شود. در چنین چرخهای، نرمافزار ابتدا اطلاعات فشرده JPEG را به تصویر پیکسلی بازسازی میکند، سپس هنگام ذخیره، همان تصویر بازسازیشده را دوباره فشرده میکند.
مفهوم اتلاف نسلی (Generation Loss) در دوران رسانههای آنالوگ بسیار رایج بود؛ مانند وقتی از سندی باکیفیت کپی میگیرید، بعد سند اصلی را کنار میگذارید و از روی همان کپی اول، کپی دوم را میگیرید. اگر این کار را بارها ادامه دهید، بهتدریج: خطوط، وضوح خود را از دست میدهند، لکهها تقویت میشوند و جزئیات ظریف کمکم از بین میروند.
چرا JPEG اطلاعات تصویر را دور میریزد؟
پیش از اینکه ببینیم چرا هر بار فشردن کلید ذخیره، عکس ما را یکقدم به نابودی نزدیکتر میکند، باید با ماهیت JPEG آشنا شویم. زیرا این فرمت برای کوچکتر کردن فایل، بخشی از اطلاعات تصویر را بادقت کمتری ذخیره میکند یا کنار میگذارد؛ بهخصوص اطلاعاتی که چشم انسان معمولاً نسبت به تغییرات ملایمشان حساسیت کمتری دارد.
JPEG برای سبک کردن فایلها، جزئیات رنگی را فدای اطلاعات روشنایی میکند
فایلهای تصویری خام یا فرمتهای بدون افت حجم بسیار بالایی دارند، زیرا تمام جزئیات رنگ و نور تکتک پیکسلها را درون خود نگه میدارند؛ اما فرمت JPEG در دستهی فرمتهای اتلافی (Lossy) قرار میگیرد و برای سبک کردن فایل، بخشهایی از اطلاعات تصویر را برای همیشه حذف میکند.
البته حذف اطلاعات بدین معنی نیست که JPEG تعدادی از پیکسلها را حذف میکند. اگر عکسی ۴۰۰۰ در ۳۰۰۰ پیکسل باشد، بعد از ذخیره مجدد به فرمت JPEG همچنان همان تعداد پیکسل را خواهد داشت؛ ولی دقت اطلاعاتی که برای بازسازی رنگ و روشنایی پیکسلها استفاده میشود، مشابه فرایند زیر کاهش مییابد:
چشم انسان به تغییرات روشنایی یا سایهروشنها حساسیت بیشتری دارد تا تغییرات ظریف رنگها، به همین دلیل بسیاری از انکودرهای JPEG اطلاعات روشنایی را با وضوح بیشتری نگه میدارند و وضوح اطلاعات رنگی را کاهش میدهند؛ پس جیپگ معمولاً اطلاعات روشنایی را بادقت بیشتری نسبت به اطلاعات رنگی حفظ میکند، عملیاتی که Chroma Subsampling خوانده میشود.
در مرحله بعد تصویر به بلوکهای کوچک، معمولاً ۸ در ۸ پیکسل، تقسیم میشود. سپس طی فرایندی به نام تبدیل کسینوسی گسسته یا DCT، جیپگ بهجای ثبت اطلاعات دقیق تکتک پیکسلهای هر بلوک، سعی میکند الگوی کلی تغییر روشنایی و رنگ در آن بخش را به زبان ریاضی و بهصورت مجموعهای از اعداد توصیف کند.
در مراحل اولیه وضوح بخشی از اطلاعات رنگی را از دست دادهایم، بااینحال، پایه اصلی مشکل ذخیره مکرر و افت غیرقابلبازگشت کیفیت، در قدم بعدی الگوریتم یعنی کوانتیزاسیون (Quantization) رخ میدهد.
کوانتیزاسیون: مرحلهای که کیفیت واقعاً از دست میرود
تا اینجا دیدیم که JPEG تصویر را به بلوکهای ۸×۸ تقسیم میکند و تغییرات نور و رنگ داخل بلوکها را به شکل یکسری اعداد و الگوهای ریاضی درمیآورد.
فرض کنید الگوریتم JPEG پس از بررسی دقیق یکی از آن بلوکهای کوچک، به مجموعهای از اعداد نزدیک به هم میرسد. اگر قرار باشد تکتک این اعداد با همین دقت بالا ذخیره شوند، فایل نهایی سنگین خواهد شد. جیپگ در مرحله کوانتیزاسیون برخی اعداد را گرد میکند و برخی را آنقدر کماهمیت در نظر میگیرد که عملاً حذف میشوند.
هرچه تنظیم کیفیت JPEG پایینتر باشد، این سادهسازی شدیدتر میشود و اطلاعات بیشتری کنار گذاشته خواهد شد. کوانتیزاسیون باعث کاهش حجم میشود، ولی اطلاعاتی که حذف شدهاند دیگر برگشتپذیر نیستند.
اطلاعاتی که در کوانتیزاسیون از دست میروند، بازگشتناپذیرند
وقتی فردا عکس را باز میکنید، نرمافزار نمایشدهنده فقط اعداد گردشده را میبیند. سیستم میتواند با اطلاعات باقیمانده تصویری بسیار شبیه به نسخهی اولیه بسازد تا شما متوجه تغییر خاصی نشوید، اما هیچ حافظهای از دادههای ازدسترفتهی دیروز ندارد.
پس از کوانتیزاسیون JPEG صفرهای پیاپی و ضرایب باقیمانده را با استفاده از جدول هافمن کدگذاری میکند؛ به موارد پرتکرار کدهای کوتاهتری میدهد تا حجم فایل بدون حذف اطلاعات بیشتر کاهش یابد.
کوانتیزاسیون مهمترین مرحله کاهش چشمگیر حجم در فرمت JPEG بهشمار میرود، هرچند به قیمت ازدسترفتن قطعی دقت تمام میشود. تا زمانی که عکس را فقط تماشا کنید، این اختلاف محاسباتی کوچک اصلاً به چشم نمیآید؛ اما وقتی میخواهید عکس را ویرایش و دوباره به JPEG تبدیل کنید، تفاوت دادههای عکس اصلی و نسخه بازسازی شده اهمیت پیدا میکند.
چرا ذخیره مجدد، کیفیت عکس را کمتر میکند؟
وقتی یک فایل JPEG را باز میکنیم، نرمافزار ابتدا باید آن را از حالت فشرده خارج کند و دوباره تصویری کامل از پیکسلها بسازد. اما این تصویر بازسازیشده دیگر حاوی همان اطلاعاتی نیست که پیش از اولین فشردهسازی وجود داشت.
فرض کنید شما فقط کمی نور تصویر را تغییر میدهید و دوباره با فرمت JPEG خروجی میگیرید؛ زمانی که دکمه Save را میزنید، فرایند فشردهسازی از نو شروع میشود.
نرمافزار تصویر بازسازیشده را دوباره تحلیل و به بلوکهای کوچک تقسیم میکند، تبدیلهای ریاضی را انجام میدهد و مجدداً به مرحله کوانتیزاسیون میرسد؛ بنابراین بار دوم دیگر از روی تصویر اولیه فایل جیپگ نمیسازیم؛ از روی نسخهای JPEG میسازیم که خودش قبلاً بخشی از اطلاعات را ازدستداده و کیفیتش پایین آمده است.
با هر بار ذخیره، نرمافزار از روی نسخه افتکرده قبلی یک کپی جدید میسازد
در واقع نرمافزار در هر چرخه، مقادیر اطلاعاتی آخرین نسخه تصویر را بهعنوان دادهی اصلی میگیرد و روی آن محاسبات فشردهسازی و کاهش حجم اجرا میکند، مثل پدیده کپیگرفتن از روی فتوکپی قبلی.
افت تدریجی کیفیت را اتلاف نسلی یا Generation Loss مینامند و باید توجه داشت که آسیب هر بار لزوماً بزرگ و واضح نیست. اگر فایل را با کیفیت بالا ذخیره کنید، شاید بعد از یک یا دو بار ذخیره متوجه هیچ تفاوت محسوسی نشوید؛ اما با تکرار ذخیرهکردن، خطاهای کوچک رویهم جمع میشوند و کمکم خودشان را نشان میدهند.
از طرفی ممکن است در هر دور فشردهسازی، اعداد دوباره گرد شوند و خطاهای تازهای به تصویر اضافه شود. پس مسئله این نیست که هر Save مستقیماً چند پیکسل را خراب میکند. با هر بار انکود مجدد، الگوریتم مجبور میشود تصویر تقریبخوردهی قبلی را بار دیگر تقریب بزند.
یک برش ساده در عکس، بلوکهای تصویر را به هم میریزد و الگوریتم را مجبور به تخریب مجدد پیکسلها میکند
وقتی تصویری را کراپ میکنید و فقط بخش باریکی از لبهی سمت چپ آن را (مثلاً ۳ پیکسل) میبرید و دوباره ذخیره میکنید، چه اتفاقی میافتد؟ گفتیم که الگوریتم عکس را به بلوکهای ۸×۸ تقسیم میکند. در حالت کراپ کردن کل این شبکه شطرنجی باید روی عکس جابهجا شود.
نرمافزار برای ذخیره تصویر بعد از کراپ، باید خطوط بلوکها را از ابتدا و روی محدودههای کاملاً جدیدی از عکس رسم کند. مقادیر و اعدادی که در ذخیرهی قبلی محاسبه و فشرده (گرد) شده بودند، نظمشان به هم میریزد، با پیکسلهای همسایه در بلوکهای جدید ترکیب میشوند و الگوریتم چارهای ندارد جز اینکه دوباره آنها را از نو تقریب بزند.
جابهجایی شبکه میتواند افت کیفیت ناشی از فشردهسازی را بیشتر کند، چون بلوکهای جدید دیگر دقیقاً بر همان نواحی قبلی تصویر منطبق نیستند.
ظهور آرتیفکتها: وقتی تقریبهای ریاضی نمایان میشوند
افت کیفیت JPEG را همیشه در فرم تاری تصویر نمیبینیم. وقتی عکسی را بارها باز و سپس ذخیره میکنیم، الگوهای خطای مشخصی روی تصویر بروز میکند که آرتیفکت فشردهسازی نامیده میشوند و معمولاً در چهار حالت به چشم میآیند.
بلوکهای شطرنجی: وقتی عکس بارها فشرده و اعداد آن گرد میشوند، مرز بین بلوکهای ۸×۸ کمکم قابلمشاهده میشود. پیکسلی و شطرنجی شدن معمولاً در قسمتهایی با تغییرات نرم رنگ یا روشنایی بیشتر جلوه میکند؛ مثلاً آسمان، دیوار صاف یا پسزمینهای که گرادیان ملایمی دارد.
نشت و بیرونزدگی رنگها: در بسیاری از فایلهای JPEG، اطلاعات رنگ با وضوح کمتری از اطلاعات روشنایی ذخیره میشود، بنابراین گاهی رنگ در مرزهای رنگی تند کمی به اطراف نشت میکند، مشکلی که بهویژه در متن رنگی روی پسزمینهی متفاوت یا گرافیکهایی با خطوط تیز راحتتر دیده میشود.
پیکسلیشدن آسمان و بیرونزدگی رنگها از مرز حروف، نتیجه مستقیم تقریبهای ریاضی JPEG هستند
اگر نوشتهای قرمز و درخشان روی پسزمینهای آبیِ خالص داشته باشید، با هر بار ذخیرهی مجدد، رنگ قرمز از مرز حروف بیرون میزند و روی پسزمینه پخش میشود.
نویز پشهای یا پیرامونی: با تکرار ذخیرهسازی، هالههایی از پیکسلهای خاکستری یا نویزهای ریز اطراف لبههای تیز مانند نوشتههای روی تصویر، شاخههای باریک درخت، سیمها یا مرز روشن و تاریک اشیا ایجاد میشود که بیشباهت به دستهای از پشههای در حال پرواز دور لبهها نیست.
نویز یا هاله غالباً به این دلیل به وجود میآید که JPEG برای توصیف تغییرات بسیار ناگهانی و جزئیات ریز، به اطلاعات بیشتری نیاز دارد؛ همان اطلاعاتی که هنگام کوانتیزاسیون با دقت کمتری نگه داشته میشوند.
ازدسترفتن بافت: جزئیات بسیار ظریف هم در شمار اولین قربانیان فشردهسازی قرار میگیرند. بافت پوست، مو، چمن، پارچه یا شن بعد از چند بار ذخیره نرمتر و سادهتر به نظر میرسد. در هر نسل، بخشی از تفاوتهای کوچک حذف میشود و تصویر بهتدریج از نسخهی اولیه فاصله میگیرد.
گاهی انتقال نرم و پیوستهی یک آسمان آبی در غروب، جای خود را به نوارهای رنگی مشخص، زمخت و پلهپله میدهد، زیرا بخشی از تفاوتهای ظریف میان رنگهای واسطه از بین رفتهاند.
افسانه Quality 100: آیا بالاترین کیفیت، عکس را نجات میدهد؟
اغلب ما بهاشتباه فکر میکنیم اگر هنگام خروجی گرفتن از عکس، کیفیت را روی درجههای بالا مثلاً ۷۵، ۹۰ یا ۱۰۰ تنظیم کنیم، دیگر تصویر دچار افت کیفیت نمیشود.
عدد Quality معمولاً تعیین میکند موتور فشردهساز انکودر در مرحلهی کوانتیزاسیون تا چه اندازه سختگیر باشد. هرچه کیفیت را روی درصد بالاتری بگذارید، مقادیر با دقت بیشتری نگه داشته میشوند و جزئیات کمتری از دست میرود. در مقابل حجم فایل هم بالاتر میرود.
اما کیفیت ۱۰۰، جیپگ را از دسته فرمتهای اتلافی خارج نمیکند. بهعلاوه اگر تصویری قبلاً یکبار با JPEG فشرده شده باشد، افزایش کیفیت نمیتواند اطلاعاتی را که در فشردهسازی قبلی حذف شدهاند، برگرداند.
تنظیم کیفیت روی ۱۰۰ درصد، دادههای از دسترفته را زنده نمیکند
فرض کنید عکسی ابتدا با کیفیت ۷۰ ذخیره میشود، یعنی در این مرحله، بخشی از جزئیات تصویر از بین میرود. حالا همان فایل را باز میکنیم و برای جبران تاری تصویر، آن را با کیفیت ۹۵ یا حتی ۱۰۰ ذخیره میکنیم.
شاید حجم فایل بهشدت بالا برود و برای مثال از ۵۰۰ کیلوبایت به ۳ مگابایت برسد، چون JPEG دوم اطلاعات موجود را با دقت بیشتری ذخیره میکند. ولی نرمافزار به اطلاعات ازدسترفتهی عکس اصلی دسترسی ندارد و اطلاعات عکس جدید از همان نسخه کیفیت ۷۰ به دست میآیند.
به بیان سادهتر، ما کیفیت ازدسترفته را برنمیگردانیم؛ فقط نسخهی ناقص موجود را با دقت بیشتری ذخیره میکنیم. شاید حجم فایل دو تا سه برابر بیشتر شود، اما جزئیات عکس خام اصلی بر نمیگردند و حتی احتمال دارد موتور فشردهساز خطاهای بیشتری را به عکس اضافه کند.
Ctrl+S: آیا هر بار ذخیرهسازی JPEG کیفیت را کمتر میکند؟
با شناخت مکانیزمهای مخرب JPEG، شاید فشردن کلیدهای میانبر Ctrl+S نگرانکننده به نظر برسد. اما شدت تخریب عکس مستقیماً به نوع عملیاتی بستگی دارد که روی فایل انجام میدهید. برای روشنشدن موضوع، رفتار سیستم را در سه سناریوی رایج بررسی میکنیم.
اگر یک فایل JPEG را از پوشهای به پوشهی دیگر کپی کنید، برای دوستی بفرستید یا روی فلش منتقل کنید، هیچ افتی کیفیتی رخ نمیدهد. در این حالت سیستم کاری با محتوای درونی عکس ندارد و همان صفر و یکهای فایل را کپی میکند و تصویر دقیقاً مثل گذشته میماند.
اما وقتی فایل را در ادیتور عکس باز میکنید و دوباره با فرمت JPEG ذخیره میکنید یا خروجی میگیرید ماجرا فرق دارد. برنامه ابتدا JPEG را باز میکند و از اطلاعات فشردهشده، تصویر پیکسلی را بازسازی میکند. بعد هنگام ذخیره، تصویر دوباره وارد فرایند فشردهسازی JPEG میشود.
جابهجایی و کپی کردن عکسها باعث افت کیفیت نمیشود
توجه کنید که Export کردن به JPEG هم معمولاً فرایند انکود را کلید میزند؛ حتی اگر اندازهی تصویر یا ظاهرش را تغییر نداده باشید. البته بعضی برنامهها ممکن است تا وقتی تغییری در تصویر ایجاد نشده، فایل را بدون بازفشردهسازی دوباره ذخیره کنند. در مقابل، بسیاری از ویرایشگرها هنگام Save یا Export یک JPEG تازه میسازند.
در سناریو بعد به چرخاندن تصویر بدون افت کیفیت (Lossless Transformation) میرسیم. اگر عکسی را در گالری گوشی یا بسیاری از نرمافزارهای استاندارد ۹۰، ۱۸۰ یا ۲۷۰ درجه بچرخانید، احتمالاً هیچ افت کیفیتی رخ نمیدهد. در برخی موارد نرمافزار فقط اطلاعات جهت تصویر در متادیتای EXIF را تغییر میدهد و در برخی ابزارها نیز چرخش با بازآرایی مستقیم دادههای جیپگ انجام میشود. البته چرخش بدون اتلاف همیشه هم صددرصد بینقص پیش نمیرود.
اگر ابعاد تصویر با مرز بلوکهای کدگذاری JPEG همتراز نباشد؛ ممکن است بخشهایی از لبههای تصویر نیاز به پردازش جداگانه داشته باشند. بهعلاوه این راهکار فقط برای زوایای خاص درجه جواب میدهد و وقتی تصویر را برای صافکردن خط افق حتی یک درجه بچرخانید؛ کل فرایند فشردهسازی باید تکرار شود.
چطور بدون افت مکرر کیفیت با JPEG کار کنیم؟
حالا که مکانیزمهای تخریب کیفیت جیپگ را میدانید، میتوانید راهحل را در تغییر روند کاریتان بیابید. برای جلوگیری از اتلاف نسلی، قانون طلایی دنیای پردازش تصویر را بهخاطر بسپارید و همیشه نسخهی اصلی یا مستر فایل را نگهدارید. خروجی JPEG قبلی را بارها بهعنوان فایل اصلی ویرایش نکنید.
همیشه روی فایل اصلی کار کنید و JPEG را فقط برای خروجی نهایی بگیرید
اگر به فرایند طولانی ویرایش نیاز دارید یا باید بارها روی یک عکس کار کنید، تغییرات را روی فایل RAW بدون اتلاف، فرمتهای PNG، TIFF یا فرمتهای اختصاصی نرمافزار مثل PSD فتوشاپ اجرا کنید. در پایان زمانیکه تصویر آمادهی انتشار یا ارسال شد، یک خروجی JPEG تهیه کنید.
کارشناسان پیشنهاد میدهند تعداد نسلهای خروجی را به حداقل برسانید. گاهی یکبار خروجی گرفتن با کیفیت پایینتر، نتیجهی تمیزتری از چند بار ذخیرهی پیاپی با کیفیتهای بالاتر میدهد، چون تعداد نسلهای فشردهسازی میتواند تأثیر بیشتری از درصد کیفیت داشته باشد.
آیا کپیکردن ویدیو و صدا هم کیفیت را کاهش میدهد؟
پدیدهی اتلاف نسلی تنها به تصاویر JPEG محدود نمیشود؛ در واقع هر فرمت دیجیتالی که بر پایهی الگوریتمهای فشردهسازی با اتلاف بنا شده باشد، همین سرنوشت را خواهد داشت.
اگر یک فایل ویدیویی را تدوین کنید و از آن خروجی بگیرید، سپس همان فایل نهایی را مجدداً وارد نرمافزار کنید و دوباره ذخیره نمایید، در هر بار تکرار چرخه کیفیت تصویر افت میکند. با هر رندر جدید، تصویر بهمرور پیکسلیتر میشود و آرتیفکتهای فشردهسازی با شدت بیشتری خود را نشان میدهند.
افت کیفیت، بهویژه در کدکهای فشرده و پرکاربردی مانند H.264 و H.265 که معمولاً در قالب فایلهای MP4 میبینیم، نمود بیشتری دارد. همین اصل برای فایلهای صوتی مانند MP3 و AAC نیز صدق میکند. در همهی این فرمتها الگوریتم برای کوچککردن فایل، بخشی از اطلاعات را کنار میگذارد. اگر خروجی ناقص دوباره ورودی همان فرایند شود، دیگر فشردهسازی جدید از نسخهی اصلی شروع نمیشود.
به همین دلیل چه با عکس کار کنید، چه ویدیو و چه صدا، در صورت امکان نسخهی اصلی یا یک فایل بدون اتلاف را بهعنوان منبع نگه دارید و خروجی اتلافی را در پایان کار ذخیره کنید. JPEG فقط یکی از شناختهشدهترین نمونههای این ماجرا است؛ چون تقریباً همهی ما بارها با عکسهایی سروکار داشتهایم که ذخیره، ویرایش و دوباره ذخیره شدهاند.