تنسيقات الصور: WebP

طوّرت Google في الأصل تنسيق WebP كتنسيق صور مع فقدان البيانات ليحل محل تنسيق JPEG، وهو تنسيق كان قادرًا على إنتاج ملفات أصغر من ملف صورة ذي جودة مشابهة مرمّز بتنسيق JPEG. قدمت التحديثات اللاحقة على التنسيق خيار الضغط بدون فقدان البيانات، وشفافية قناة ألفا مثل PNG، والرسوم المتحركة المشابهة لـ GIF - وكلها يمكن استخدامها إلى جانب الضغط مع فقدان بنمط JPEG. تنسيق WebP هو تنسيق متنوّع جدًا.

تستند خوارزمية الضغط مع فقدان البيانات في WebP إلى طريقة يستخدمها برنامج ترميز الفيديو VP8 لضغط الإطارات الرئيسية في الفيديوهات. على مستوى عالٍ، يكون الأمر مشابهًا لترميز JPEG: يعمل WebP من حيث "الكتل" وليس وحدات البكسل الفردية، وله انقسام مماثل بين السطوع والتأطير. تكون كتل اللوما في WebP هي 16×16، بينما تكون كتل الكروما 8×8، وتنقسم هذه "الكتل البرمجية الكبيرة" إلى مجموعات فرعية بحجم 4×4.

هناك طريقتان يختلف تنسيق WebP اختلافًا جذريًا عن تنسيق JPEG في الميزتَين التاليتَين: "توقّع الحظر" و "تحديد كمية الحظر التكيُّفي".

حظر التنبؤ

التنبؤ بالكتلة هو العملية التي يتم من خلالها توقع محتويات كل كتلة من مستويات التلاشي والتركيز بناءً على قيم الكتل المحيطة بها، وتحديدًا الكتل البرمجية أعلى الكتلة الحالية ويسارها. كما يمكنك أن تتخيل، الخوارزميات التي تقوم بهذا العمل معقدة إلى حد ما، ولكن لوضعها في لغة بسيطة: "إذا كان هناك أزرق فوق الكتلة الحالية، وأزرق على يسار الكتلة الحالية، فافترض أن هذه الكتلة زرقاء".

في الواقع، يقدّم تنسيق PNG وJPEG أيضًا هذا النوع من التوقّع بدرجة إلى. مع ذلك، يكون تنسيق WebP فريدًا من حيث أنّه يأخذ عيّنة من بيانات الكتل المحيطة، ثم يحاول ملء المجموعة الحالية عن طريق العديد من "أوضاع التوقّع" المختلفة التي تحاول "رسم" الجزء المفقود من الصورة. بعد ذلك، تتم مقارنة النتائج التي يقدمها كل وضع تنبؤ ببيانات الصورة الحقيقية، ويتم اختيار أقرب تطابق تنبؤي.

مخطّط بياني يعرض طرق توقّع الكتل المختلفة في WebP.

حتى أقرب تطابق تنبؤي لن يكون صحيحًا تمامًا بالطبع، لذلك يتم ترميز الاختلافات بين القيم المتوقعة والقيم الفعلية لهذه المجموعة في الملف. عند فك ترميز الصورة، يستخدم محرك العرض البيانات نفسها لتطبيق المنطق التنبؤي نفسه، ما يؤدي إلى الوصول إلى القيم المتوقّعة نفسها لكل كتلة. ثم يتم تطبيق الفرق بين التوقع والصورة المتوقعة التي تم ترميزها في الملف على التوقعات، على غرار الطريقة التي يمثل بها تنفيذ Git تصحيح تفاضلي يتم تطبيقه على الملف المحلي، بدلاً من نسخة جديدة تمامًا من الملف.

ولتوضيح ذلك: بدلاً من التعمق في العمليات الحسابية المعقدة التي تنطوي عليها الخوارزمية التنبؤية الحقيقية، سنبتكر ترميزًا يشبه WebP بوضع تنبؤ واحد، وسنستخدمه لنقل شبكة من الأرقام بكفاءة بالطريقة التي فعلناها مع التنسيقات القديمة. تحتوي خوارزميتنا على وضع تنبؤ واحد، والذي سنسميه "وضع التنبؤ الأول": قيمة كل كتلة هي مجموع قيم الكتل فوقها وعلى يسارها، بدءًا من 1.

لنفترض الآن أننا سنبدأ ببيانات الصورة الحقيقية التالية:

111151111
122456389

باستخدام نموذجنا التنبؤي لتحديد محتويات شبكة 2×9، سنحصل على النتيجة التالية:

111111111
123456789

تتوافق بياناتنا بشكل جيد مع الخوارزمية التنبؤية التي اخترناها - البيانات المتنبأ بها هي تطابق وثيق مع بياناتنا الحقيقية. ليس الأمر مناسبًا تمامًا، بالطبع، تحتوي البيانات الفعلية على عدة كتل تختلف عن البيانات المتنبأ بها. إذًا، لا يتضمن الترميز الذي نرسله طريقة التنبؤ التي يمكن استخدامها فحسب، بل يشمل أيضًا اختلافًا بين أي كتل يجب أن تختلف عن قيمها المتوقعة:

_ _ _ _ +4 _ _ _ _
_ _ -1 _ _ _ -4 _ _

أدرِج اللغة العادية نفسها المستخدَمة في بعض ترميزات التنسيقات القديمة التي ناقشناها:

شبكة 2×9 باستخدام وضع التنبؤ الأول. +4 إلى 1x5، -1 إلى 2x3، -4 إلى 2x7.

وتكون النتيجة النهائية ملفًا مرمّزًا فعّالاً بشكل كبير.

تحديد كميّة الحظر التكيُّفي

ضغط JPEG هو عملية شاملة، يتم تطبيق نفس المستوى من الكمي على كل كتلة في الصورة. في صورة بتكوين موحد، يكون ذلك منطقيًا بالتأكيد - لكن الصور في العالم الحقيقي ليست أكثر توحيدًا من العالم من حولنا. من الناحية العملية، يعني ذلك أنه لا يتم تحديد إعدادات ضغط JPEG الخاصة بنا من خلال تفاصيل التردد العالي - حيث يبرز ضغط JPEG - ولكن من خلال أجزاء الصورة التي غالبًا ما تظهر فيها عناصر الضغط.

صورة JPEG مضغوطة لفراشة ملكية

كما ترى في هذا المثال المبالَغ فيه، تبدو أجنحة الملك في المقدمة حادة نسبيًا، حيث تبدو غامضة بعض الشيء عند مقارنتها مع الأصل عالي الدقة، ولكن بالتأكيد لا يمكن ملاحظتها بدون الأصل لمقارنتها به. وبالمثل، فإن الإزهار المفصل للعشب اللبن والأوراق في المقدمة — قد نرى أنت وآثار الآثار الانضغاطية لأعيننا المدرّبة، ولكن حتى مع الضغط بدرجة تتجاوز المستويات المعقولة، لا تزال العناصر واضحة في المقدّمة. تبدو المعلومات منخفضة التكرار في أعلى يمين الصورة، الخلفية الخضراء المموّهة لأوراق الشجر، سيئة. حتى المشاهد غير المدرّب سيلاحظ على الفور مشكلة الجودة، حيث يتم تقريب التدرجات الطفيفة في الخلفية إلى كتل مسنّنة وذات لون واحد.

لتجنب ذلك، يتّبع WebP منهجًا تكيُّفيًا في تحديد الكمّية: يتم تقسيم الصورة إلى ما يصل إلى أربع شرائح متشابهة من الناحية المرئية، ويتم ضبط مَعلمات الضغط لتلك القطاعات بشكلٍ مستقل. استخدام الضغط بالحجم نفسه مع تنسيق WebP:

صورة WebP مضغوطة لفراشة ملكية

حجم ملفَّي الصور هذَين مماثلَين تقريبًا. وتكون الجودة هي نفسها عندما ننظر إلى جناحَي الملك، ويمكنك ملاحظة بعض الاختلافات الطفيفة في النتيجة النهائية إذا نظرت عن كثب جدًا، ولكن لا يوجد فرق حقيقي في الجودة الإجمالية. في تنسيق WebP، تُعتبر أزهار الأعشاب الحليب "أكثر وضوحًا" قليلة، ومن المحتمل ألا تكون ملحوظة بشكل كافٍ ما لم تقارن بين الاثنين جنبًا إلى جنب وتبحث حقًا عن اختلافات في الجودة على النحو الذي نتمتع به. الخلفية هي قصة مختلفة معًا: فهي بالكاد لا تتضمن أي أثر من عناصر JPEG الواضحة. يمنحنا WebP نفس حجم الملف، ولكن صورة ذات جودة أعلى بكثير — أعط أو خذ بعض التفاصيل الصغيرة التي لن تتمكن أنظمتنا النفسية البصرية من اكتشافها إذا لم نقارن هما عن كثب.

استخدام تنسيق WebP

قد تكون الجوانب الداخلية لتقنية WebP أكثر تعقيدًا إلى حد كبير من ترميز JPEG، ولكنها بسيطة أيضًا لغرض عملنا اليومي: فجميع تعقيدات ترميز WebP يتم توحيدها حول قيمة واحدة لـ "جودة" يتم التعبير عنها من 0 إلى 100، تمامًا مثل JPEG. ومرة أخرى، هذا لا يعني أنك مقتصر على إعداد واحد شامل "للجودة". يمكنك - ويجب عليك - تعديل كل التفاصيل الدقيقة لترميز WebP، وذلك إذا أردت فقط فهم كيفية تأثير هذه الإعدادات غير المرئية بشكل طبيعي على حجم الملف وجودته.

توفّر Google برنامج ترميز سطر أوامر cwebp يتيح لك تحويل أو ضغط ملفات فردية أو أدلة كاملة للصور:

$ cwebp -q 80 butterfly.jpg -o butterfly.webp

Saving file 'butterfly.webp'
File:   butterfly.jpg
Dimension: 1676 x 1418
Output: 208418 bytes Y-U-V-All-PSNR 41.00 43.99 44.95   41.87 dB
        (0.70 bpp)
block count:    intra4:     7644  (81.80%)
               Intra16:     1701  (18.20%)
               Skipped:       63  (0.67%)
bytes used:  header:            249  (0.1%)
              mode-partition:  36885  (17.7%)
Residuals bytes  |segment 1|segment 2|segment 3|segment 4|  total
macroblocks:     |       8%|      22%|      26%|      44%|   9345
quantizer:       |      27 |      25 |      21 |      13 |
filter level:    |       8 |       6 |      19 |      16 |

وإذا كنت لا تميل نحو سطر الأوامر، فسيستخدمنا Squoosh أيضًا لترميز WebP. إنه يمنحنا خيار المقارنات جنبًا إلى جنب بين الترميزات والإعدادات ومستويات الجودة المختلفة والاختلافات في حجم الملف من ترميز JPEG.