جوهر الضغط: التعبير عن نفس المعلومات ببيانات أقل
قبل الغوص في التمييز بين الضغط بدون فقدان والضغط بخسارة، نحتاج إلى فهم ما يفعله الضغط فعليًا.
في جوهره، يتمثل الضغط في التعبير عن نفس المعلومات ببيانات أقل. أي بيانات — سواء كانت نصًا أو صورًا أو صوتًا أو فيديو — تحتوي على «تكرار». يشير التكرار إلى الأجزاء التي يمكن إزالتها دون فقدان معنى المعلومات. مهمة خوارزمية الضغط هي تحديد هذا التكرار والقضاء عليه.
لنأخذ مثالًا بسيطًا. تشغل سلسلة الأحرف AAAAABBBCC عشر بايتات. ولكن يمكننا تمثيل نفس المعلومات بشكل أكثر إيجازًا بتسجيل «كل حرف وعدد مرات تكراره على التوالي»، مما يعطي 5A3B2C — ست بايتات فقط. ينخفض حجم البيانات بنسبة 40%، لكن المعنى متطابق. هذه هي أبسط أشكال الضغط، المعروفة باسم Run-Length Encoding (RLE).
من منظور نظرية المعلومات، قدّم كلود شانون مفهوم «إنتروبيا المعلومات»: يُحدد متوسط طول الترميز الأدنى لتدفق بيانات ما بإنتروبياه. لا يمكن لأي خوارزمية بدون فقدان أن تكسر هذا الحد النظري. هذا يعني أن إعادة ضغط بيانات مضغوطة بالفعل لا تكاد تعطي أي فائدة — فقد تم بالفعل تجريد التكرار.
يُظهر فهم هذا الجوهر مسارين تقنيين مختلفين اختلافًا جوهريًا: الضغط بدون فقدان يسعى إلى دقة مثالية، بينما الضغط بخسارة يتجاهل عمدًا التفاصيل التي لا يمكن للعين أو الأذن البشرية إدراكها بسهولة، مقايضًا بها للحصول على نسبة ضغط أعلى بكثير.
الضغط بدون فقدان: استعادة كل بت
الوعد الأساسي للضغط بدون فقدان هو أن البيانات غير المضغوطة متطابقة بايتًا ببايت مع الأصل — لا يجوز أن يختلف بت واحد. تُزيل هذه الخوارزميات «التكرار الإحصائي» و«التكرار الهيكلي» فقط، دون المساس بالمحتوى الدلالي للمعلومات إطلاقًا.
DEFLATE: خوارزمية الضغط بدون فقدان الأكثر استخدامًا
DEFLATE هي الخوارزمية الكامنة وراء ZIP وgzip وzlib والعديد من الأدوات الأخرى. فهي تجمع بين تقنيتين كلاسيكيتين بأناقة:
- LZ77: تستخدم نافذة منزلقة للبحث عن السلاسل الفرعية المتكررة في البيانات المُعالجة بالفعل، واستبدالها بمؤشرات «مسافة + طول». على سبيل المثال، يمكن استبدال كلمة «الضغط» المتكررة في ملف نصي بمرجع خلفي إلى أول ظهور لها.
- ترميز هوفمان: يطبق ترميزًا متغير الطول على تدفق الرموز الذي ينتجه LZ77. تحصل الرموز المتكررة على رموز قصيرة؛ وتحصل الرموز النادرة على رموز طويلة. هذا يدفع الترميز نحو حد الإنتروبيا.
نقاط قوة DEFLATE هي بساطته وسرعته وتوافقه الشامل — فكل مكتبة قياسية تقريبًا للغات البرمجة تتضمن تنفيذًا له.
LZMA: نسب أعلى عبر النمذجة السياقية
يبني LZMA (Lempel-Ziv-Markov chain Algorithm) على LZ77 بنافذة منزلقة أكبر بكثير (حتى عدة غيغابايت)، ونموذج احتمالية أكثر دقة، وترميز النطاق. مقارنة بـ DEFLATE، يحقق LZMA عادةً نسب ضغط أعلى، على حساب سرعة ضغط أبطأ واستهلاك ذاكرة أكبر. يعتمد تنسيق 7z على LZMA.
التحسين الرئيسي في LZMA هو أنه لا يعتمد على جدول احتمالات ثابت. بدلًا من ذلك، يتنبأ ديناميكيًا باحتمالية الرمز التالي بناءً على السياق. هذه «النمذجة السياقية» تقرب الترميز كثيرًا من الحد النظري للإنتروبيا.
ترشيح PNG: معالجة مسبقة لبيانات الصور
PNG هو تنسيق صور بدون فقدان، لكنه لا يطبق DEFLATE مباشرة على قيم البكسل الخام. قبل الضغط، يطبق PNG «مرشحًا» على كل صف من صفوف البكسلات لجعل البيانات أكثر ملاءمة لـ DEFLATE.
يخزن مرشح شائع الفرق بين كل بكسل وجاره الأيسر، أو العلوي، أو العلوي الأيسر. نظرًا لأن الصور الطبيعية لها بكسلات متشابهة محليًا، فإن هذه الفروقات تميل إلى التركز حول الصفر. تتمتع هذه البيانات المحولة بتكرار أعلى، مما يسمح لـ DEFLATE بضغطها بشكل أكثر فعالية بكثير.
هذا يفسر أيضًا سبب عدم قدرة ZIP على ضغط صور JPEG بفعالية: فـ JPEG مضغوط بالفعل بدرجة عالية عبر DCT وترميز الإنتروبيا، ولا يترك تقريبًا أي تكرار إحصائي يمكن لـ DEFLATE استغلاله. عادةً ما يضيف تشغيل ZIP على ملف JPEG بضع بايتات من عبء الترويسة دون أي تقليل في الحجم.
الضغط بخسارة: المقايضة تحت عتبة الإدراك
الفكرة المركزية للضغط بخسارة هي أن الإدراك البشري له حدود. إذا وقعت التفاصيل المهجورة تحت عتبة الإدراك، فإن الفرق البصري أو السمعي ضئيل — لكن تقليل البيانات يمكن أن يكون هائلًا.
DCT: الأساس الرياضي لـ JPEG
تحويل جيب التمام المتقطع (DCT) هو قلب ضغط صور JPEG. دوره تحويل الصورة من «النطاق المكاني» إلى «نطاق التردد».
في النطاق المكاني، تُمثل الصورة بقيم سطوع البكسلات. في نطاق التردد، تُفكك الصورة إلى مجموع مكونات موجات جيب التمام بترددات مختلفة: تمثل مكونات التردد المنخفض المساحات الكبيرة الناعمة، بينما تمثل مكونات التردد العالي الحواف والتفاصيل الدقيقة.
تحويل DCT نفسه قابل للعكس ولا يفقد أي معلومات. تحدث «الخسارة» الفعلية في الخطوة التالية — التكميم.
التكميم: مصدر الخسارة
يُعيّن التكميم معاملات DCT عالية الدقة إلى مجموعة محدودة من القيم المنفصلة. في الممارسة، يُقسم كل معامل على قيمة من جدول التكميم ثم يُقرّب إلى عدد صحيح. نظرًا لأن العين البشرية أقل حساسية لتفاصيل التردد العالي، يطبق جدول التكميم مقسومات أكبر على معاملات التردد العالي، مما يجعل كثيرًا منها يصبح صفرًا.
تتسبب هذه الخطوة في فقدان معلومات لا رجعة فيه — بمجرد تقريب معامل إلى الصفر، لا يمكن استرداده. لكنها تخلق أيضًا فرصة ضغط هائلة: يمكن ترميز التتابعات الطويلة من الأصفار بكفاءة عالية باستخدام ترميز طول التتابع.
تصميم جدول التكميم هو فن: فالمقسومات الأكبر تنتج ضغطًا أعلى لكن فقدانًا أوضح في الجودة. هذا بالضبط ما يتحكم فيه معامل جودة JPEG (مثل quality=80) — فهو يقيس جدول التكميم لأعلى أو لأسفل.
التنبؤ بين الإطارات: مفتاح ضغط الفيديو
يذهب ضغط الفيديو خطوة أبعد من الصور الثابتة. تتغير الإطارات المتتالية في الفيديو قليلًا عادةً (على سبيل المثال، خلفية ثابتة مع شخص يتحرك)، لذا ليست هناك حاجة لتخزين كل إطار بالكامل.
يستخدم التنبؤ بين الإطارات «تقدير الحركة» لإيجاد الإزاحة بين الإطار الحالي وإطار مرجعي، مخزنًا «متجهات الحركة» و«البواقي» فقط. يسمح هذا القضاء على التكرار الزمني لنسب ضغط الفيديو بالوصول إلى مئات أو حتى آلاف إلى واحد — وهو أبعد بكثير مما يمكن أن يحققه ضغط الصور أحادية الإطار.
بدون فقدان مقابل بخسارة: مخطط المقارنة
يوضح المخطط الانسيابي أدناه الفروع الرئيسية والتطبيقات النموذجية لعائلتي الضغط:
مخطط مبدأ DCT
يبسط المخطط أدناه كيف يحول DCT كتلة بكسلات 8x8 من النطاق المكاني إلى نطاق التردد، ثم يحفظ الترددات المنخفضة متجاهلًا الترددات العالية عبر التكميم:
أمثلة التعليمات البرمجية
الضغط بدون فقدان باستخدام zlib
import zlib
# بيانات نصية أصلية مع تكرار كثيف
original = b"compression compression compression " * 50
# الضغط
compressed = zlib.compress(original, level=9)
print(f"الحجم الأصلي: {len(original)} بايت")
print(f"الحجم المضغوط: {len(compressed)} بايت")
print(f"النسبة: {len(original) / len(compressed):.2f}x")
# فك الضغط والتحقق من أن البيانات متطابقة
decompressed = zlib.decompress(compressed)
assert decompressed == original, "عدم تطابق البيانات!"
print("تم اجتياز التحقق: البيانات غير المضغوطة متطابقة مع الأصل")
عند تشغيل هذا الكود، سترى عادةً نسبة ضغط تتجاوز 10x، والبيانات غير المضغوطة متطابقة بايتًا ببايت مع الأصل. هذا هو معنى «بدون فقدان».
الضغط بخسارة باستخدام PIL
from PIL import Image
import io
# إنشاء صورة اختبار غنية بتفاصيل التردد العالي
img = Image.new("RGB", (512, 512))
pixels = img.load()
for x in range(512):
for y in range(512):
# توليد نمط بتفاصيل التردد العالي
pixels[x, y] = ((x * 7) % 256, (y * 5) % 256, ((x + y) * 3) % 256)
# الحفظ كـ PNG بدون فقدان
img.save("test_lossless.png")
png_size = len(open("test_lossless.png", "rb").read())
print(f"حجم PNG (بدون فقدان): {png_size} بايت")
# الحفظ كـ JPEG بخسارة بجودة 20 لتضخيم التأثير
buffer = io.BytesIO()
img.save(buffer, format="JPEG", quality=20)
jpeg_size = buffer.tell()
print(f"حجم JPEG (بخسارة): {jpeg_size} بايت")
print(f"النسبة: {png_size / jpeg_size:.2f}x")
# إعادة تحميل JPEG ومقارنة فروقات البكسلات
buffer.seek(0)
img_jpeg = Image.open(buffer)
diff_count = sum(
1 for x in range(512) for y in range(512)
if img.getpixel((x, y)) != img_jpeg.getpixel((x, y))
)
print(f"البكسلات المتغيرة: {diff_count} / {512 * 512}")
print("الخلاصة: ضغط JPEG يغير قيم البكسلات بشكل لا رجعة فيه")
يوضح هذا الكود السمة المميزة للضغط بخسارة: ملف أصغر، لكن مع قيم بكسلات تغيرت بشكل لا رجعة فيه.
جدول المقارنة
| البُعد | الضغط بدون فقدان | الضغط بخسارة |
|---|---|---|
| المبدأ الأساسي | يزيل التكرار الإحصائي والهيكلي | يتجاهل المعلومات تحت عتبة الإدراك |
| الدقة | عكسي 100%، متطابق بعد فك الضغط | غير عكسي، فقدان لا يمكن استرداده |
| الخوارزميات النموذجية | DEFLATE, LZMA, Brotli, Zstandard | DCT+تكميم، مويجات، MDCT |
| التقنيات الرئيسية | LZ77، ترميز هوفمان، ترميز النطاق | ترميز التحويل، التكميم، التنبؤ |
| التطبيقات النموذجية | ZIP, GZIP, 7Z, PNG, FLAC | JPEG, WebP, H.264, MP3, AAC |
| الأنسب لـ | النص، الكود المصدري، الأرشيفات، التصوير الطبي | الصور، الفيديو، الموسيقى، البث |
| النسبة النموذجية | عادة من 2x إلى 5x | عادة من 10x إلى 100x أو أعلى |
| غير مناسب لـ | البيانات المضغوطة بالفعل (مثل ملفات JPEG) | البيانات التي تتطلب إعادة إنتاج دقيقة (مثل النصوص القانونية) |
الأسئلة الشائعة
س1: لماذا لا يستطيع ZIP ضغط صورة JPEG؟
بحلول وقت إنشاء JPEG، يكون قد مر بالفعل عبر DCT والتكميم وترميز الإنتروبيا. لقد تم القضاء على التكرار الإحصائي في البيانات بالكامل تقريبًا. لا يستطيع DEFLATE إيجاد أنماط تكرار قابلة للاستغلال، لذا فإن تشغيل ZIP على ملف JPEG لا يقلل الحجم فحسب، بل قد يضيف بضع بايتات من عبء الترويسة.
س2: هل PNG دائمًا أكبر من JPEG لنفس الصورة؟
ليس بالضرورة. بالنسبة للصور ذات المساحات الكبيرة من اللون الموحد أو لوحة ألوان محدودة (مثل الشعارات أو الأيقونات أو لقطات الشاشة)، فإن مجموعة المرشح-زائد-DEFLATE في PNG غالبًا ما تكون أصغر من JPEG وتحافظ على جودة مثالية. ولكن بالنسبة للصور الفوتوغرافية الطبيعية الغنية بالألوان، تحقق مجموعة DCT-زائد-التكميم في JPEG عادةً نسب ضغط تتجاوز 10x، مما يجعلها أصغر بكثير من PNG.
س3: هل يمكن ضغط نفس الملف بشكل متكرر بخوارزمية بدون فقدان؟
لا. كل مرور من الضغط بدون فقدان يدفع البيانات أقرب إلى حد الإنتروبيا الخاص بها. بعد المرور الأول، يختفي التكرار إلى حد كبير، وليتبقى للمرور الثاني بالكاد شيء يستغله — بل قد يزداد حجمًا قليلًا بسبب البيانات الوصفية المضافة. لهذا السبب فإن «ضغط ملف مضغوط بالفعل» بلا جدوى.
الخلاصة
الضغط بدون فقدان والضغط بخسارة ليسا معسكرين متعارضين، بل خيارات مثالية تُتخذ لخصائص معلومات مختلفة:
- الضغط بدون فقدان يخدم البيانات التي «لا يجوز أن يخطئ فيها بت واحد» — النص، الكود، الأرشيفات. فهو يستخدم تقنيات مثل LZ77 وترميز هوفمان للقضاء على التكرار الإحصائي مع ضمان إعادة بناء مثالية.
- الضغط بخسارة يخدم التفاصيل «التي لا يمكن للعين والأذن إدراكها» — الصور، الفيديو، الموسيقى. فهو يستخدم DCT والتكميم والتنبؤ بين الإطارات لإجراء مقايضات تحت عتبة الإدراك، مُقايضًا بفقدان معلومات مُتحكم به مقابل تحسينات بمقدار منزلة في نسبة الضغط.
إن فهم الفرق الجوهري بين هذين المسارين هو حجر الزاوية لإتقان جميع تقنيات الضغط. في المقالات اللاحقة، سنتعمق في تطبيقات الخوارزميات المحددة على طول كل مسار، فاهمًا أناقة الضغط سطرًا بسطر.
مقالات ذات صلة:
- الدليل الشامل لضغط الملفات: مبادئ وطرق ضغط PDF/الصور/الفيديو/المستندات
- مبادئ وطرق ضغط PDF: كيفية تقليل حجم PDF بفعالية
- دليل ضغط الصور: مقارنة واختيار صيغ JPG/PNG/WebP
هل تحتاج لضغط الملفات؟ جرّب SmartSlim
على أساس محرك ضغط Rust خاص، يدعم 10 فئات رئيسية و40+ صيغة بما في ذلك PDF/الصور/الفيديو/Office/OFD. معالجة محلية — البيانات لا تغادر نطاقك.