كيف يعمل ضغط JPEG فعليًا
جولة مرئية في ضغط JPEG: تحويل DCT وجداول التكميم، ولماذا تُضغط بعض الصور أفضل من غيرها.

JPEG هو الصرصور في عالم صيغ الملفات. تم توحيده عام 1992، أي قبل ظهور متصفح الويب، ونجا من كل محاولة لاستبداله. WebP وAVIF وHEIC كلها تضغط بكفاءة أعلى، ومع ذلك ما زال JPEG أكثر صيغ الصور انتشارًا على الإنترنت. جزء من ذلك بسبب القصور الذاتي. لكن جزءًا آخر يعود إلى أن خط ضغط JPEG عبقري فعلًا، وهو نموذج تطبيقي رائع في معالجة الإشارات يستحق الفهم حتى لو لم تكتب مُرمِّزًا (encoder) بنفسك أبدًا.
معظم المطورين يتعاملون مع JPEG كصندوق أسود: تضع صورة فيخرج ملف أصغر، ثم ترفع مؤشر الجودة حتى تبدو الصورة مقبولة. لكن فهم ما يجري داخل هذا الصندوق يغيّر طريقة تفكيرك في الصور والضغط والمفاضلة بين حجم الملف والجودة البصرية.
نظرة سريعة على خط المعالجة
ضغط JPEG عبارة عن خط معالجة من خمس مراحل، وكل مرحلة تفعل شيئًا ذكيًا. السحر أنها تتكامل فيما بينها: كل مرحلة تُهيّئ المرحلة التالية لتكون أكثر فعالية.
- تحويل فضاء الألوان — من RGB إلى YCbCr (فصل السطوع عن اللون)
- أخذ عينات الكروما (Chroma Subsampling) — تقليل دقة قنوات الألوان
- تحويل جيب التمام المتقطع (DCT) — تحويل البيانات المكانية إلى بيانات ترددية
- التكميم (Quantization) — التخلص من التفاصيل عالية التردد (وهذه هي الخطوة المفقدة للبيانات)
- الترميز الإنتروبي (Entropy Coding) — ضغط بلا فقد للبيانات المُكمَّمة
الخطوتان 1 و2 تستغلان طريقة عمل الرؤية البشرية. الخطوتان 3 و4 تستغلان خصائص الصور الطبيعية. أما الخطوة 5 فهي ضغط بيانات قياسي. كل خطوة بسيطة بذاتها، والفكرة الحقيقية تكمن في تسلسلها.
الخطوة 1: تحويل فضاء الألوان
كاميرتك تلتقط الصور بنظام RGB، أي قنوات الأحمر والأخضر والأزرق، بعمق 8 بت لكل بكسل. أول ما يفعله JPEG هو تحويل هذه البيانات إلى YCbCr: قناة واحدة للإضاءة (السطوع) وقناتان للألوان (chrominance). هذه الخطوة ليست ضغطًا بعد، فلا تُفقد أي بيانات. إنها تحويل إحداثيات، أشبه بتدوير المحاور.
ولماذا نفعل ذلك؟ لأن العين البشرية أكثر حساسية للسطوع بكثير منها للون. تستطيع رؤية تفاصيل دقيقة جدًا في صورة بالأبيض والأسود، لكن قدرتك على تمييز دقة الألوان أضعف بكثير. وبفصل السطوع عن اللون، يستطيع JPEG التعامل مع كل منهما بشكل مختلف: الحفاظ على تفاصيل السطوع مع تقليل تفاصيل اللون بقوة.
RGB to YCbCr conversion (simplified):
Y = 0.299R + 0.587G + 0.114B (luminance — brightness)
Cb = -0.169R - 0.331G + 0.500B (blue chrominance)
Cr = 0.500R - 0.419G - 0.081B (red chrominance)
Note: green dominates the luminance calculation because
human eyes have far more green-sensitive cone cells.
This isn't arbitrary — it matches the physiology.
الخطوة 2: أخذ عينات الكروما
هنا يحدث أول تقليل حقيقي للبيانات. بما أن البشر لا يدركون اللون بالدقة المكانية الكاملة، يقلل JPEG دقة قناتي Cb وCr، عادةً إلى النصف في كل بُعد. يُسمى هذا أخذ عينات 4:2:0. فلكل أربعة بكسلات للسطوع، توجد عينة لون واحدة.
النتيجة: قلّصت البيانات الخام إلى النصف تقريبًا (من ثلاث قنوات بدقة كاملة إلى قناة كاملة وقناتين بربع الدقة)، والصورة تبدو مطابقة تقريبًا للأصل. جرّب ذلك بنفسك: خذ أي صورة فوتوغرافية وقلّل دقة قنوات الألوان أربع مرات، وستجد صعوبة في ملاحظة الفرق. دماغك يملأ تفاصيل اللون من معلومات السطوع.
لا تنجح هذه الطريقة بنفس الدرجة مع كل الصور. الصور الفوتوغرافية تُضغط بشكل ممتاز لأن المشاهد الطبيعية تحتوي على تدرجات لونية ناعمة. لكن الصور ذات حدود الألوان الحادة، مثل النص على خلفية ملونة، أو دائرة حمراء على خلفية بيضاء، أو فن البكسل، تظهر فيها هالات لونية واضحة بعد أخذ عينات الكروما. ولهذا السبب يُعد JPEG ضعيفًا مع النصوص: حواف الألوان الحادة تتسرب وتتداخل.
الخطوة 3: تحويل جيب التمام المتقطع (DCT)
هنا يصبح JPEG مثيرًا للاهتمام. تُقسَّم الصورة إلى كتل بحجم 8×8 بكسل، ويُحوَّل كل كتلة من المجال المكاني (قيم سطوع البكسلات) إلى المجال الترددي (مقدار كل تردد مكاني موجود).
فكّر في الأمر هكذا: كتلة 8×8 من البكسلات يمكن تمثيلها كمجموع موزون من 64 نمطًا أساسيًا. النمط الأول كتلة مسطحة تمثل المتوسط. الأنماط التالية تضيف تدرجات أفقية وعمودية. وكلما زاد رقم النمط، أضاف تفاصيل أدق، أي تذبذبات سريعة في السطوع.
An 8x8 DCT block conceptually:
DC ──► Low frequency ──────────────► High frequency
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│ AVG │ → │ → │ → │ → │ → │ → │ → │ Low freq
│ │ │ │ │ │ │ │ │ ↓
│ ↓ │ ↘ │ │ │ │ │ │ │
│ │ │ ↘ │ │ │ │ │ │
│ │ │ │ ↘ │ │ │ │ │
│ │ │ │ │ ↘ │ │ │ │
│ │ │ │ │ │ ↘ │ │ │
│ │ │ │ │ │ │ ↘ │ │
│ │ │ │ │ │ │ │ FINE │ High freq
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
Top-left = low frequency (smooth gradients)
Bottom-right = high frequency (sharp edges, fine detail)
Natural images: most energy concentrated in top-left
Text/line art: significant energy in bottom-right
تحويل DCT نفسه بلا فقد: يمكنك إعادة بناء كتلة 8×8 الأصلية تمامًا من معاملات DCT الـ64. لكن الخاصية الحاسمة هنا أن الصور الطبيعية (الفوتوغرافيا والتدرجات والملمس العضوي) تتركز معظم طاقتها في المعاملات منخفضة التردد. أما المعاملات عالية التردد، التي تمثل التفاصيل الدقيقة، فتميل إلى أن تكون صغيرة. وهذا ما يجعل الخطوة التالية تعمل.
لماذا 8×8؟ لأنه حل وسط. الكتل الأكبر (16×16 أو 32×32) تركّز الطاقة بشكل أفضل، لكنها أغلى حسابيًا وتسبب تأثيرات 'التكتل' (blocking) المرئية عند الجودات المنخفضة. أما الكتل الأصغر (4×4) فتقلل التكتل لكنها لا تركّز الطاقة بنفس الكفاءة. لذلك كانت 8×8 النقطة المثالية التي صمدت لأكثر من 30 عامًا.
الخطوة 4: التكميم، حيث تضيع البيانات
هذه هي الخطوة المفقدة للبيانات. يُقسَم كل معامل DCT على قيمة مقابلة من جدول التكميم، ثم يُقرَّب الناتج إلى أقرب عدد صحيح. المقامات الكبيرة (للمعاملات عالية التردد) تحوّل القيم الصغيرة إلى أصفار. وهذه الأصفار تضيع إلى الأبد، وهنا تُفقد المعلومات بشكل دائم.
Example quantization (quality ~50):
DCT coefficient: 42.7 Quantization divisor: 16 Result: round(42.7/16) = 3
DCT coefficient: 8.3 Quantization divisor: 40 Result: round(8.3/40) = 0
DCT coefficient: -2.1 Quantization divisor: 99 Result: round(-2.1/99) = 0
The quality slider in your image editor controls the quantization table.
Quality 100: divisors close to 1 (almost no rounding, huge file)
Quality 75: moderate divisors (good balance, typical web use)
Quality 50: large divisors (noticeable artifacts, small file)
Quality 10: very large divisors (blocky mess, tiny file)
جدول التكميم هو أهم عامل منفرد في جودة JPEG. يعرّف معيار JPEG جدولًا افتراضيًا، لكن المُرمِّزات يمكنها استخدام أي جدول تريده. المُرمِّزات الحديثة مثل MozJPEG تستخدم جداول محسّنة تستخلص جودة أكبر من ملفات أصغر، عبر ضبط المقامات بحسب حساسية الإدراك البشري، فتكون أكثر قوة على الترددات التي يكون البشر أقل حساسية لها.
بعد التكميم، تحتوي كتلة 8×8 متوسطة الجودة عادةً على ما بين 6 و10 معاملات غير صفرية من أصل 64. والباقي أصفار. هذا التقليص الكبير في القيم غير الصفرية هو ما يجعل خطوة الضغط الأخيرة فعّالة.
الخطوة 5: الترميز الإنتروبي
الخطوة الأخيرة هي ضغط بلا فقد للمعاملات المُكمَّمة. يستخدم JPEG مزيجًا من ترميز طول التشغيل (RLE) وترميز Huffman. تُقرأ المعاملات بنمط zigzag من داخل كتلة 8×8، بدءًا من معامل DC في الزاوية العلوية اليسرى ثم التنقل عبر الترددات المتزايدة. هذا يجمع كل الأصفار المتبقية معًا، ويتعامل معها RLE بكفاءة: بدلًا من تخزين '0, 0, 0, 0, 0, 0, ..., 0'، يخزّن 'سبعة وأربعين صفرًا'.
ثم يُخصص ترميز Huffman تسلسلات بت أقصر للقيم الأكثر شيوعًا، وتسلسلات أطول للقيم النادرة. وبما أن معظم المعاملات غير الصفرية أعداد صحيحة صغيرة (1، -1، 2، -2)، فإنها تحصل على شيفرات قصيرة جدًا. والنتيجة: الكتلة 8×8 المُكمَّمة، التي بدأت بـ64 قيمة، تُضغط عادةً إلى ما بين 20 و40 بايت حسب محتوى الصورة وإعداد الجودة.
لماذا تُضغط بعض الصور أفضل من غيرها
فهم الخط يفسّر سلوك الضغط الذي يبدو غامضًا بدونه.
- الصور الفوتوغرافية تُضغط جيدًا لأن لها تدرجات لونية ناعمة (أخذ عينات الكروما يعمل بشكل ممتاز)، ومعظم طاقتها في معاملات DCT منخفضة التردد (التكميم يصفّر كثيرًا من المعاملات دون تأثير مرئي).
- النص والرسوم الخطية تُضغط بشكل ضعيف لأن الحواف الحادة تنتج معاملات DCT عالية التردد كبيرة، لا يمكن تصفيرها دون ظهور تشوهات مرئية. وتصبح حدود الكتل 8×8 مرئية كهالات حول حواف النص.
- الضوضاء تُفسد الضغط لأن ضوضاء المستشعر بيانات عشوائية عالية التردد. كل بكسل مشوّش يضيف معاملات عالية التردد غير صفرية تقاوم التكميم. قد تكون صورة مشوّشة بجودة 80 أكبر بثلاث إلى خمس مرات من صورة نظيفة للمشهد نفسه بالجودة نفسها.
- التدرجات شبه مجانية لأن التدرج الناعم عبر كتلة 8×8 يُمثَّل بمعاملين أو ثلاثة فقط من معاملات DCT. والباقي أصفار حتى بدون تكميم.
- إعادة الحفظ تُضعف الجودة لأن كل عملية حفظ تطبّق التكميم من جديد، فتتراكم أخطاء التقريب. حفظ ملف JPEG عشر مرات بجودة 75 يكون أسوأ بوضوح من حفظه مرة واحدة بالجودة نفسها. ولهذا يجب دائمًا التعديل انطلاقًا من الملف الأصلي.
مؤشر الجودة ليس خطيًا
يتعامل معظم المطورين مع مؤشر جودة JPEG كأنه مفاضلة خطية: الجودة 50 نصف جودة 100، وحجمها نصف الحجم. وكلا الأمرين غير صحيح.
الجودة 100 ليست 'بلا فقد'، فهي ما زالت تطبّق التكميم، لكن بمقامات صغيرة. الملف يكون ضخمًا (غالبًا أكبر من PNG) ولا يختلف بصريًا عن الجودة 95. والجودة 95 لا تختلف بصريًا عن الجودة 90 للصور الفوتوغرافية. الفرق الإدراكي بين الجودة 85 و75 أكبر من الفرق بين 100 و85. وتحت الجودة 50، تصبح التشوهات شديدة، وتتباطأ مكاسب تقليل الحجم.
النقطة المثالية لصور الويب عادةً هي الجودة 75 إلى 85. تحت 75 تظهر التشوهات بوضوح بالحجم المعتاد للعرض. وفوق 85 يزداد حجم الملف بشكل كبير مع تحسن إدراكي ضئيل جدًا. والجودة الافتراضية لـ MozJPEG وهي 75 اختيار موفق، فهي تصيب 'الركبة' في منحنى الجودة مقابل الحجم لمعظم الصور الفوتوغرافية.
مُرمِّزات JPEG الحديثة أذكى مما تظن
معيار JPEG يحدد صيغة فك الترميز، لا المُرمِّز نفسه. وهذا يعني أن تطبيقات المُرمِّز يمكن أن تختلف كثيرًا في كفاءة الضغط، مع إنتاج ملفات متوافقة مع المعيار. طوّرت Mozilla مكتبة MozJPEG، وهي تنتج ملفات أصغر بنسبة 5 إلى 15% من libjpeg بنفس الجودة البصرية، وذلك عبر عدة تقنيات.
- التكميم بالشبكة (Trellis quantization) — بدلًا من تقريب كل معامل DCT بشكل مستقل، يأخذ هذا الأسلوب في الاعتبار تأثير قرارات التقريب على مرحلة الترميز الإنتروبي، ويتخذ خيارات أفضل على مستوى الملف كله.
- جداول Huffman محسّنة — جداول Huffman الافتراضية في JPEG عامة. أما MozJPEG فتولّد جداول مخصصة مضبوطة على توزيع المعاملات الفعلي في كل صورة.
- الترميز التدريجي (Progressive encoding) — تخزّن JPEG التدريجية المعاملات على عدة مرات (الدقة الخشنة أولًا ثم التحسين). وغالبًا ما يضغط هذا أفضل من الترميز التسلسلي، لأن المرور الخشن يملك توزيعات معاملات أكثر قابلية للتنبؤ.
- جداول تكميم تكيفية — بدلًا من جدول تكميم واحد للصورة كلها، تضبط المُرمِّزات التكيفية التكميم لكل منطقة، فتكون أكثر قوة في المناطق المزدحمة (حيث التشوهات أقل وضوحًا)، وأكثر تحفظًا في المناطق الناعمة.
إذا كنت تقدّم صورًا على الويب، فالتحول من مُرمِّز libjpeg الافتراضي إلى MozJPEG من أسهل مكاسب الأداء المتاحة. معظم شبكات توصيل المحتوى (CDN) ومكتبات معالجة الصور تدعمه. عملية الترميز أبطأ (وهذا لا يهم للصور الثابتة المعالجة مسبقًا)، والنتيجة أصغر بنفس الجودة.
JPEG مقابل الصيغ الجديدة
تعتمد WebP وAVIF وHEIC كلها تقنيات ضغط أحدث: كتل تحويل أكبر، ومرشحات إزالة التكتل داخل الحلقة (in-loop deblocking filters)، والتنبؤ داخل الإطار (intra-prediction) الذي يستخدم الكتل المجاورة للتنبؤ بالكتلة الحالية. وهي تضغط بنسبة 20 إلى 50% أفضل من JPEG بنفس الجودة البصرية. وAVIF على وجه الخصوص، المبني على مرمّز الفيديو AV1، كفاءته مدهشة.
إذن لماذا ما زال JPEG في كل مكان؟ لأن دعمه شامل. كل المتصفحات، وكل عارض صور، وكل نظام تشغيل، وكل كاميرا، وكل هاتف، وكل برنامج يتعامل مع الصور يدعم JPEG. WebP قريب من الشمولية في المتصفحات لكنه يفتقر إلى الدعم على مستوى أنظمة التشغيل. أما دعم AVIF فما زال غير متسق. وHEIC يقتصر أساسًا على منظومة Apple. لصيغة يجب أن تعمل في كل مكان، ما زال JPEG الخيار الآمن الوحيد.
النصيحة العملية: استخدم AVIF أو WebP مع JPEG كخيار احتياطي إذا كانت بنيتك التحتية تدعم ذلك (معظم شبكات CDN تدعمه عبر التفاوض على المحتوى). وإذا لم تستطع استخدام صيغة واحدة فقط، فإن JPEG مرمّزًا بـ MozJPEG بجودة 80 يصعب التفوق عليه للصور الفوتوغرافية. أما لقطات الشاشة والرسوم التخطيطية والصور الكثيفة بالنصوص، فيبقى PNG الخيار الأفضل — أو استكشف طرقًا أكثر إبداعًا لتمثيل الصور.
كتلة 8×8 التي غزت العالم
خط ضغط JPEG مثال كلاسيكي على هندسة تعمل مع الإدراك البشري لا ضده. كل مرحلة تستغل خاصية محددة: عدم حساسية العين للون، وتوزيع الترددات في الصور الطبيعية، والإخفاء الإدراكي لضوضاء التكميم. وتتكامل هذه الخصائص في نظام يقلّل حجم الملفات بمقدار 10 إلى 20 مرة بأقل تأثير مرئي. وبعد أربعة وثلاثين عامًا، ما زالت كتل DCT 8×8 نفسها التي عملت على عتاد عام 1992 تحمل معظم الصور على الإنترنت. وهذه علامة على تصميم أصاب الأساسيات.


