«اضغط هذه الصورة» أربع عمليات مختلفة تتنكّر في زرّ واحد. ومعرفة أيّها يكلّفك جودة تجعل الإعدادات أقلّ غموضًا بكثير.
الخطوة الأولى: فكّ الترميز
يُعاد الملف المضغوط إلى شبكة من البكسلات. والمتصفحات تفعل ذلك بكود أصلي، وبتسريع عتادي حيث توفّره المنصة، وهي تتعامل مع JPEG وPNG وWebP وAVIF — إضافة إلى HEIC على منصات آبل، لأن نظام التشغيل يشحن ذلك المفكّك أصلًا.
وفكّ الترميز بلا فقد بالنسبة إلى الملف: تحصل على البكسلات التي يصفها الملف بالضبط. أما الفقد فقد حدث من قبل، حين رمّزه ما أنتجه.
الخطوة الثانية: الاتجاه
كاميرات الهواتف تخزّن الاتجاه الخام للمستشعر، ومعه وسم EXIF منفصل يقول كيف تُدار الصورة. والبرمجيات التي تتجاهل ذلك الوسم تنتج صورًا مقلوبة على جنبها. وتطبيق الوسم يعني إدارة شبكة البكسلات الفعلية قبل أن يمسّها أي شيء آخر — وبعدها لا يعود الوسم لازمًا، وهذا جزء من سبب إسقاط إعادة الترميز للبيانات الوصفية.
الخطوة الثالثة: إعادة العيّنات
إن تعذّر بلوغ الحجم الهدف بالدقة الكاملة، صُغِّرت الصورة. وهنا يُكسب كثير من الجودة المدرَكة أو يُفقد في صمت. فمرشّح الصندوق الرخيص يأخذ متوسط البكسلات المتجاورة فيلطّف كل شيء؛ أما مرشّح Lanczos فيزن جوارًا أوسع ويُبقي الحوافّ حادّة.
وإعادة العيّنات مدمِّرة فعلًا — فالبكسلات المطروحة لا تعود — لكنها كثيرًا ما تكون أقلّ الطرق تدميرًا لبلوغ حجم صغير، لأنها تزيل تفاصيل كان المرمّز سينفق ميزانيته كلها في محاولة فاشلة لوصفها.
الخطوة الرابعة: الترميز
الجزء ذو الفقد. يحوّل JPEG الصورة إلى تمثيل قوامه السطوع مع اللون، ويطرح شيئًا من دقة اللون (والعين تكاد لا تلاحظ)، ويقسّم الصورة إلى كتل بحجم 8×8، ويحوّل كل كتلة إلى مركّبات ترددية، ثم يكمّم — أي يقرّب التفاصيل عالية التردد فيمحوها. ومعامل الجودة هو خشونة ذلك التقريب. وكل ما يأتي بعده ترميز إنتروبيا بلا فقد، ولهذا يوفّر جدول هوفمان محسَّن أو مسح تدريجي بايتات بلا ثمن.
أين يدخل WebAssembly
مرمّز المتصفح المدمج صندوق أسود: تستطيع أن تطلب رقم جودة ولا شيء غيره. لا جداول إنتروبيا محسَّنة، ولا اختيار بين الأساسي والتدريجي، ولا تحكّم في مرشّح إعادة العيّنات، ولا سبيل لمعرفة كم بايتًا سينتجه إعداد ما قبل تجربته.
ومرمّز مترجَم إلى WebAssembly يعيد ذلك كله، مقابل البايتات التي تنفقها في تنزيله. وToolZool يشغّل السلسلة كاملة بهذه الطريقة — فكّ الترميز والاتجاه وإعادة العيّنات والترميز كلها Rust مترجَمة إلى WebAssembly، في عامل خلفية — بدل تسليم فكّ الترميز إلى المتصفح. ولذلك ثلاثة أسباب عملية كلها:
- البحث يحتاج عمليات ترميز كثيرة. بلوغ حجم محدّد يعني ترميز الصورة نفسها خمس أو ست مرات. وامتلاك المرمّز هو ما يجعل ذلك رخيصًا وقابلًا للتكرار.
- المفكّك يجب أن يستطيع أن يقول لا. ملف يعلن أن أبعاده 60,000 × 60,000 بكسل يجب أن يُرفض قبل أن يحجز الذاكرة، وملف مبتور يجب أن يفشل بدل أن يعيد نصف صورة. ومفكّك المتصفح يتخذ قراراته الخاصة هناك؛ أما مفكّكنا فيعلن الحدود ويفرضها.
- المدخل نفسه يجب أن يعطي المخرج نفسه. مفكّكات المتصفحات تختلف في معالجة الألوان وفي تعاملها مع الملفات المشوَّهة. وسلسلة تملك طرفيها تنتج البايتات نفسها على كل جهاز، وهذا ما يجعل النتيجة قابلة للفحص.
والثمن معلن: ذلك المحرّك تنزيل. وهو لا يُجلَب إلا حين تختار ملفًا، فقراءة صفحة كهذه لا تدفع ثمنه أبدًا.
لماذا يهمّ البحث أكثر من المرمّز
عند حجم ملف مستهدَف، الفرق بين مرمّز جيد ومرمّز ممتاز بضع نقاط مئوية. أما الفرق بين التخمين على شريط الجودة والبحث عن القيمة الصحيحة فأكبر بكثير، لأن تخمينًا يستقرّ عند 60% من المسموح لك يكون قد رمى ثلث الجودة التي كنت تستحقها. وهذه هي الفكرة كلها وراء الضغط إلى حجم محدد، وكيف تصل إلى حد 50 KB يبيّن ما يشتريه لك البحث في أصعب طرف من المدى.

