Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Adaptive Huffman and Lossless Compression Techniques - Documentation

841 views

Published on

The doc discusses Adaptive Huffman for data encryption (by Ismaeel Abu-Abdalla). Adaptive Huffman is used for video encryption to pass it on a stream and synchronously be played in the other end other stream. VLC Player API has been used for this (by Mehdi Zonji). This doc also discusses the implementation of different lossless compression techniques (by me) in multimedia; RLE (compression and decompression for any data type; specific technique is used for images.) RLE Quad Tree compress images according to their color bulks. The engine implements also the lossless techniques based on adaptive dictionaries; i.e. LZ77(for text and images, using windows and lookahead buffers) and LZW (for text and images, using a dictionary). Arithmetic coding algorithm is also implemented (by Hasan Sarhan.)

Published in: Software
  • Be the first to comment

  • Be the first to like this

Adaptive Huffman and Lossless Compression Techniques - Documentation

  1. 1. 4/28/2012 MULTIMEDIA ASSIGNMENT #2 | JAEGER & ZGTR & HASSNOV & POD ‫اهلل‬ ‫عبد‬ ‫أبو‬ ‫إسماعيل‬‫شاكر‬ ‫محمد‬ ‫سرحان‬ ‫حسه‬ ‫محمد‬‫زوجي‬ ‫مهدي‬ ‫الصوص‬ ‫مدحت‬ 2102 LOSSLESS COMPRESSION ENGINE
  2. 2. April 28, 2012 [LOSSLESS COMPRESSION ENGINE] ‫خوارزمية‬ Adaptive Hoffman 1 Contents 1‫خوارزمية‬Adaptive Hoffman...................................................................................................................3 1.1‫خطوات‬‫العمل‬....................................................................................................................................3 1.1.1‫البحث‬.....................................................................................................................................3 1.1.1‫التعامل‬‫مع‬‫ناتج‬‫البحث‬....................................................................................................................3 1.1.3‫تحديث‬‫الشجرة‬..............................................................................................................................3 1.1.1‫إعادة‬‫الرمز‬‫المناسب‬......................................................................................................................3 1.1‫التحسينات‬‫على‬‫ّة‬‫ي‬‫الخوارزم‬.....................................................................................................................3 1.3‫تابع‬‫البحث‬........................................................................................................................................3 2‫عرض‬‫الفيديو‬‫اثناء‬‫فك‬‫الضغط‬.......................................................................................................1 1.1‫كيفية‬‫استخدام‬VLC Player:................................................................................................................5 3‫الخوارزميات‬‫اإلضافية‬..................................................................................................................6 ‫مالحظة‬..................................................................................................................................................6 3.1‫خوارزمية‬RLE‫الرئيسة‬(RLEBasic)......................................................................................................7 3.1.1‫خورازمية‬‫الضغط‬........................................................................................................................7 3.1.2‫خوارزمية‬‫فك‬‫الضغط‬....................................................................................................8 3.1‫خوارزمية‬Method1RLE...................................................................................................................9 3.2.1‫خوارزمية‬‫الضغط‬.....................................................................................................................9 3.2.2‫خوارزمية‬‫فك‬‫الضغط‬...............................................................................................................11 3.3‫خوارزمية‬Method2RLE.................................................................................................................11 3.3.1‫خوارزمية‬‫الضغط‬.......................................................................................................11 3.3.2‫خوارزمية‬‫فك‬‫الضغط‬..................................................................................................................11 3.1‫خوارزمية‬QuadTreeRLE................................................................................................................11 3.4.1‫خوارزمية‬‫الضغط‬.......................................................................................................................11 3.4.2‫خوارزمية‬‫فك‬‫الضغط‬..................................................................................................................13 3.5‫الخوارزميات‬‫المعتمدة‬‫على‬‫القواميس‬‫المتغيرة‬‫بشكل‬‫ديناميكي‬Adaptive Dictionary.......................................13 3.5.1‫خوارزمية‬LZ77........................................................................................................................13 ‫النافذة‬Window....................................................................................................................................13 ‫المكان‬‫المحجوز‬‫قدما‬Buffer.....................................................................................................................11 ‫بنية‬‫المعطيات‬Buffer..............................................................................................................................11 3.5.1‫خوارزمية‬LZW........................................................................................................................15 3.6‫خوارزمية‬Arithmetic coding.........................................................................................................17 1‫بنية‬‫المشروع‬(‫الخوارزميات‬‫اإلضافية‬).........................................................................................................18
  3. 3. April 28, 2012 [LOSSLESS COMPRESSION ENGINE] ‫خوارزمية‬ Adaptive Hoffman 2 5‫واجهة‬‫المستخدم‬)‫جميعها‬ ‫ّات‬‫ي‬‫(الخوارزم‬......................................................................................................11
  4. 4. April 28, 2012 [LOSSLESS COMPRESSION ENGINE] ‫خوارزمية‬ Adaptive Hoffman 3 1‫خوارزمية‬Adaptive Hoffman ‫ّة‬‫ي‬‫خوارزم‬ ‫في‬ ‫التشفير‬ ‫وفك‬ ‫التشفير‬Adaptive Huffman‫في‬ ‫وتشتركان‬ ،‫ا‬ّ‫د‬‫ج‬ ‫كبير‬ ‫لحد‬ ‫متشابهان‬ ‫عام‬ ‫بشكل‬ ‫ّتين‬‫ي‬‫الخوارزم‬ ‫شرح‬ ‫في‬ ‫الخطوات‬ ‫هذه‬ ‫تظهر‬ .‫عديدة‬ ‫خطوات‬ 1.1‫العمل‬ ‫خطوات‬ ‫الخطوات‬–‫سابقا‬ ‫ذكرنا‬ ‫كما‬-‫ال‬ ‫وهذه‬ ،‫التشفير‬ ‫وفك‬ ‫التشفير‬ ‫بين‬ ‫العام‬ ‫بالشكل‬ ‫متطابقة‬:‫هي‬ ‫خطوات‬ 1.1.1‫البحث‬ ‫المدخل‬ ‫الرمز‬ ‫عن‬ ‫البحث‬ ‫بتات‬ ‫تتابع‬ ‫فيكون‬ ‫التشفير‬ ‫فك‬ ‫حال‬ ‫في‬ ‫أما‬ ،‫بايت‬ ‫هو‬ ‫الرمز‬ ‫هذا‬ ‫يكون‬ ‫التشفير‬ ‫حال‬ ‫في‬ 1.1.1‫البحث‬ ‫ناتج‬ ‫مع‬ ‫التعامل‬ ‫عدد‬ ‫زيادة‬ ّ‫م‬‫ويت‬ ‫للبايت‬ ‫جديد‬ ‫ورود‬ ‫أنه‬ ‫على‬ ‫التعامل‬ ّ‫م‬‫يت‬ ،‫سابقا‬ ‫موجودة‬ ‫لعقدة‬ ‫الوصول‬ ّ‫م‬‫ت‬ ‫حال‬ ‫في‬ ‫بمقدار‬ ‫تكراره‬ ‫مرات‬1‫أما‬ ،‫التشفير‬ ‫حال‬ ‫في‬ ‫المطلوب‬ ‫البايت‬ ‫نوجد‬ ‫(لم‬ ‫مسدود‬ ‫لخط‬ ‫الوصول‬ ّ‫م‬‫ت‬ ‫حال‬ ‫في‬ ‫والعقدة‬New.‫جديدة‬ ‫عقدة‬ ‫إضافة‬ ّ‫م‬‫فيت‬ )‫التشفير‬ ‫فك‬ ‫حال‬ ‫في‬ 1.1.1‫الشجرة‬ ‫تحديث‬ ( ‫صالحة‬ ‫شجرة‬ ‫تبقى‬ ‫لكي‬ ‫الشجرة‬ ‫بتحديق‬ ‫القيام‬ ‫الضروري‬ ‫من‬Huffman Treeّ‫المرجو‬ ‫ق‬ّ‫ق‬‫وتح‬ ) ‫الحال‬ ‫في‬ ‫الشجرة‬ ‫وتحديث‬ ،‫ّة‬‫ي‬‫الخوارزم‬ ‫من‬)‫حديثا‬ ‫المضافة‬ ‫(أو‬ ‫أخيرا‬ ‫ثة‬ّ‫د‬‫المح‬ ‫العقدة‬ ‫من‬ ‫يبدأ‬ ،‫واحد‬ ‫تين‬ .‫الشجرة‬ ‫لجذر‬ ‫ليصل‬ ‫ويصعد‬ 1.1.1‫المناسب‬ ‫الرمز‬ ‫إعادة‬ ‫بايت‬ ‫فيكون‬ ‫التشفير‬ ‫فك‬ ‫حالة‬ ‫في‬ ‫أما‬ ،)‫بتات‬ ‫(تتالي‬ ‫أكثر‬ ‫أو‬ ‫بايت‬ ‫أو‬ ‫بت‬ ‫نرد‬ ‫قد‬ ‫التشفير‬ ‫حال‬ ‫في‬ .‫العامة‬ ‫بالحالة‬ 1.1‫ة‬ّ‫ي‬‫الخوارزم‬ ‫على‬ ‫التحسينات‬ ‫تعمل‬ ‫ّة‬‫ي‬‫الخوارزم‬ ‫إن‬‫ال‬ ‫قد‬ ‫التحسينات‬ ‫أو‬ ‫التعديالت‬ ‫بعض‬ ‫وإن‬ ،‫عليها‬ ‫تعديل‬ ‫أي‬ ‫دون‬ ‫بطيء‬ ‫بشكل‬ .‫ملحوظ‬ ‫بشكل‬ ‫سرعتها‬ ‫ترفع‬ ‫ها‬ّ‫ن‬‫لك‬ ‫ا‬ّ‫د‬‫ج‬ ‫سريعة‬ ‫ّة‬‫ي‬‫الخوارزم‬ ‫تجعل‬ 1.1‫البحث‬ ‫تابع‬ ،‫ّن‬‫ي‬‫مع‬ ‫بايت‬ ‫قيمة‬ ‫تحمل‬ ‫التي‬ ‫العقدة‬ ‫عن‬ ‫ها‬ّ‫ل‬‫ك‬ ‫الشجرة‬ ‫في‬ ‫يبحث‬ ‫التشفير‬ ‫مرحلة‬ ‫في‬ ‫البحث‬ ‫تابع‬ ‫عناصره‬ ‫عدد‬ ‫يصل‬ ‫قد‬ ‫شجرة‬ ‫في‬ ‫وتبحث‬‫إلى‬ ‫ا‬511‫في‬ ‫للبحث‬ ‫تحتاج‬ ‫ّا‬‫ي‬‫عمل‬ ‫بينما‬ ‫عنصر‬156‫عقدة‬
  5. 5. April 28, 2012 [LOSSLESS COMPRESSION ENGINE] 4 .‫األلياف‬ ‫فقط‬ ‫بل‬ ،‫الواصلة‬ ‫العقد‬ ‫ّها‬‫م‬‫ته‬ ‫ال‬ ‫حيث‬ ،‫ّا‬‫ي‬‫عمل‬ ‫األكثر‬ ‫على‬ ( ‫لأللياف‬ ‫ّا‬‫ي‬‫نسب‬ ‫الصغير‬ ‫للعدد‬ ‫نظرا‬156‫قاموس‬ ‫في‬ ‫تخزينها‬ ‫فإن‬ )Dictionary‫كل‬ ‫كون‬ ‫ا‬ّ‫د‬‫ج‬ ‫عملي‬ ‫ع‬ ‫ّر‬‫ب‬‫يع‬ ‫الذي‬ ‫البات‬ ‫رقم‬ ‫ل‬ّ‫يمث‬ ‫ّز‬‫ي‬‫مم‬ ‫مفتاح‬ ‫له‬ ‫منها‬.‫نه‬ 1‫الضغط‬ ‫فك‬ ‫اثناء‬ ‫الفيديو‬ ‫عرض‬ ‫الـ‬ ‫قيام‬ ‫اثناء‬Decoder‫فك‬ ‫بعد‬ ‫البايتات‬ ‫بتخزين‬ ‫نقوم‬ ,‫الشبكة‬ ‫طريق‬ ‫عن‬ ‫اليه‬ ‫القادم‬ ‫الملف‬ ‫ضغط‬ ‫بفك‬ ‫بشكل‬ ‫الملف‬ ‫هذا‬ ‫محتويات‬ ‫بعرض‬ ‫نقوم‬ ‫الوقت‬ ‫نفس‬ ‫وفي‬ ,‫الصلب‬ ‫القرص‬ ‫على‬ ‫ملف‬ ‫في‬ ‫ضغطها‬ .‫متزامن‬ ‫الـ‬ ‫قدرة‬ ‫لعدم‬ ‫نظرا‬Components‫نت‬ ‫الـدوت‬ ‫بيئة‬ ‫في‬ ‫الموجودة‬-‫عموما‬ ‫الفيديو‬ ‫مشغالت‬ ‫او‬-‫على‬ ‫الـ‬ ‫مكاتب‬ ‫باستخدام‬ ‫قمنا‬ ‫فيه‬ ‫الكتابة‬ ‫اثناء‬ ‫فيديو‬ ‫ملف‬ ‫عرض‬VLC Player‫خوارزمية‬ ‫الى‬ ‫باالضافة‬ .‫الضغط‬ ‫فك‬ ‫مع‬ ‫متزامن‬ ‫بشكل‬ ‫محتواه‬ ‫وعرض‬ ‫الملف‬ ‫تشغيل‬ ‫من‬ ‫تمكنا‬ ‫بسيط‬ ‫م‬ ‫اسرع‬ ‫الفديو‬ ‫ملف‬ ‫قراءة‬ ‫سرعة‬ ‫بأن‬ ‫المشكلة‬ ‫تكمن‬‫الملف‬ ‫تشغيل‬ ‫فعند‬ .‫الكتابة‬ ‫و‬ ‫الضغط‬ ‫فك‬ ‫سرعة‬ ‫ن‬ ‫يرفض‬ ‫وقد‬ ,‫الملف‬ ‫بايتات‬ ‫تتمنة‬ ‫وجود‬ ‫لعدم‬ ‫وذلك‬ ,‫العرض‬ ‫بايقاف‬ ‫المشغل‬ ‫يقوم‬ ‫نهايته‬ ‫الى‬ ‫والوصول‬ .‫ترويسته‬ ‫اكتمال‬ ‫لعدم‬ ‫الملف‬ ‫تشغيل‬ ‫الـ‬ ‫مكاتب‬ ‫استخدام‬ ‫على‬ ‫يعتمد‬ ‫المتبع‬ ‫الحل‬VLC Player‫توقف‬ ‫وعند‬ ,‫الفيديو‬ ‫محتوى‬ ‫لعرض‬ ‫العرض(لل‬‫ثم‬ ,‫الفيديو‬ ‫ملف‬ ‫من‬ ‫جزء‬ ‫كتابة‬ ‫الكتمال‬ ‫معينة‬ ‫زمنية‬ ‫فترة‬ ‫بانتظار‬ ‫نقوم‬ )َ‫ا‬‫انف‬ ‫المذكور‬ ‫سبب‬ ‫الملف‬ ‫عرض‬ ‫نكمل‬ ‫وثم‬ ,‫قصيرة‬ ‫زمنية‬ ‫لفترة‬ ‫بالمحتوى‬ ‫العودة‬ ‫المشغل‬ ‫من‬ ‫نطلب‬ ‫مكاتب‬ ‫ان‬ ‫بما‬VLC Player‫الـ‬ ‫بلغة‬ ‫مكتوبة‬c++‫الـ‬ ‫هي‬ ‫عليها‬ ‫نعمل‬ ‫التي‬ ‫والبيئة‬dotnet‫فقمنا‬ ‫ط‬ ‫باستخدام‬‫الـ‬ ‫ريقة‬P/Invoke‫التالي‬ ‫بالشكل‬ ‫المكاتب‬ ‫هذا‬ ‫الستخدام‬ [DllImport("libvlc", CallingConvention = CallingConvention.Cdecl)] public static extern void libvlc_media_player_play(IntPtr player, ref libvlc_exception_t ex);
  6. 6. April 28, 2012 [LOSSLESS COMPRESSION ENGINE] ‫عرض‬‫الفيديو‬‫اثناء‬‫فك‬‫الضغط‬ 5 ‫الـ‬ ‫يحدد‬ ‫حيث‬DllImport‫المفتاحية‬ ‫الكلمة‬ ‫تدل‬ .‫استعمالها‬ ‫نريد‬ ‫التي‬ ‫المكتبة‬ ‫اسم‬extern‫ان‬ ‫على‬ .‫خارجية‬ ‫مكتبة‬ ‫في‬ ‫معرف‬ ‫التالي‬ ‫التابع‬ ‫مالحظة‬‫المكتبة‬ ‫في‬ ‫المعرف‬ ‫التابع‬ ‫اسم‬ ‫هنا‬ ‫التابع‬ ‫اسم‬ ‫يوافق‬ ‫ان‬ ‫البد‬ : 1.1‫استخدام‬ ‫كيفية‬VLC Player: 1.‫بانشاء‬ ‫نقوم‬Instance‫الـ‬ ‫من‬VLC‫تابع‬ ‫باستخدام‬libvlc_new 1.‫بالـ‬ ‫يسمى‬ ‫ما‬ ‫ننشئ‬media‫باستخدام‬ ‫عرضه‬ ‫نود‬ ‫الذي‬ ‫الملف‬ ‫ويمثل‬libvlc_media_new 3.( ‫المشغل‬ ‫نعرف‬player‫التابع‬ ‫طريق‬ ‫عن‬ ‫السابق‬ ‫الميديا‬ ‫بعرض‬ ‫سيقوم‬ ‫والذي‬ ) libvlc_media_player_new_from_media 4.‫التابع‬ ‫باستخدام‬ ‫بالعرض‬ ‫البدء‬ ‫المشغل‬ ‫من‬ ‫نطلب‬libvlc_media_player_play ‫التالية‬ ‫التوابع‬ ‫طريق‬ ‫عن‬ ‫بالمشغل‬ ‫التحكم‬ ‫يمكن‬ Libvlc_media_player_stop:.‫العرض‬ ‫بايقاف‬ ‫يقوم‬ Libvlc_media_player_pause:.‫مؤقت‬ ‫بشكل‬ ‫العرض‬ ‫يوقف‬ Libvlc_media_player_get_position:‫الـ‬ ‫بين‬ ‫قيمة‬ ‫يرد‬[0,1]‫تم‬ ‫التي‬ ‫النسبة‬ ‫وتمثل‬ ‫الملف‬ ‫من‬ ‫عرضها‬ Libvlc_media_player_set_position:‫معينة‬ ‫نقطة‬ ‫من‬ ‫ابتداءا‬ ‫المحتوى‬ ‫بعرض‬ ‫يقوم‬ Libvlc_media_player_set_drawable:‫عليها‬ ‫الفديو‬ ‫عرض‬ ‫نود‬ ‫التي‬ ‫النافذة‬ ‫يحدد‬
  7. 7. April 28, 2012 [LOSSLESS COMPRESSION ENGINE] ‫الخوارزميات‬‫اإلضافية‬ 6 1‫اإلضافية‬ ‫الخوارزميات‬ ‫للضغط‬ ‫اإلضافية‬ ‫الخوارزميات‬ ‫من‬ ‫العديد‬ ‫بإضافة‬ ‫المشروع‬ ‫هذا‬ ‫في‬ ‫قمنا‬‫بالمعلومات‬ ‫المحتفظ‬ ‫هي‬ ‫كما‬(Lossless Compression)‫والنصوص‬ ‫الصور‬ ‫لضغط‬ ‫وذلك‬‫هنا‬ ‫سنذكرها‬. ‫مالحظة‬ ‫الضغط‬ ‫وفك‬ ‫(الضغط‬ ‫الخوارزميات‬ ‫توابع‬ ‫جميع‬Encode/Decode)‫توابع‬ ‫ضمن‬ ‫هي‬static ‫بـ‬ ‫متعلق‬ ‫غير‬ ‫الضغط‬ ‫وفك‬ ‫الضغط‬ ‫ألن‬ ‫وذلك‬stream‫مثال‬ ‫الضغط‬ ‫فك‬ ‫خوارزمية‬ ‫فعلى‬ ‫معينة‬ ‫لها‬ ‫المقابلة‬ ‫الضغط‬ ‫خوارزمية‬ ‫بنفس‬ ‫مضغوطة‬ ‫تكون‬ ‫أن‬ ‫شريطة‬ ‫تكن‬ ‫مهما‬ ‫المعطيات‬ ‫فك‬ ‫الـ‬ ‫بنية‬ ‫نفس‬ ‫لها‬ ‫وبالتالي‬stream.‫إطالقا‬ ‫بمحتواها‬ ‫العلم‬ ‫دون‬ ‫فقط‬
  8. 8. April 28, 2012 [LOSSLESS COMPRESSION ENGINE] ‫الخوارزميات‬‫اإلضافية‬ 7 1.1‫خوارزمية‬RLE( ‫الرئيسة‬RLEBasic) ،‫والصور‬ ‫للنصوص‬ ‫خوارزمية‬ ‫وهو‬‫عدد‬ ‫حفظ‬ ‫على‬ ‫تعتمد‬‫وإضافته‬ ‫المحرف‬ ‫مرور‬ ‫تكرار‬ ‫مع‬ ‫المضغوطة‬ ‫للسلسلة‬8‫إتمام‬ ‫كل‬ ‫مع‬ ‫تضاف‬ ‫أصفار‬8.‫ضغوطات‬ ‫الـ‬ ‫خوارزميات‬ ‫جميع‬ ‫في‬ ‫نستخدم‬RLE‫البنية‬DataUnit:‫التكرارات‬ ‫لحفظ‬ 1.1.1‫خورازمية‬‫الضغط‬ private static Stream EncodeStream(Stream streamOfIds) { Stream compressedStream; Stream miniCompressedStream; flagStr = ("00000000"); int counterFlag = 0; for (int i = 0; i < streamOfIds.Count; i++) { counterFlag++; if (ShouldInsertFlag(counterFlag)) { compressedStream.AddRange(flagStr); compressedStream.AddRange(miniCompressedStream); counterFlag = 1; flagStr = ("00000000"); } DataUnit dataUnit = CatchNextTokenEncode(streamOfIds, i); if (dataUnit.RepeatCounter > 1) { miniCompressedStream.Add(dataUnit.RepeatCounter); flagStr[counterFlag] = '1'; i += dataUnit.RepeatCounter - 1; } miniCompressedStream.Add(dataUnit.Id); } return compressedStream; } DataUnit { byte Id; int RepeatCounter; }
  9. 9. April 28, 2012 [LOSSLESS COMPRESSION ENGINE] ‫الخوارزميات‬‫اإلضافية‬ 8 1.1.1‫الضغط‬ ‫فك‬ ‫خوارزمية‬ private static Stream Decode (Stream OfIds) { Stream original; string currentFlagStr = “”; int counterFlag = 0; for (int i = 0; i < OfIds.Count; i++) { if (ShouldRetrieveFlag(counterFlag)) { currentFlagStr = GetString(OfIds, i, 8); counterFlag = 8; i += 7; } else { Stream nextTokenList = CatchNextTokenDecode(OfIds, i, currentFlagStr[8-ounterFlag]); original.AddRange(nextTokenList); if (nextTokenList.Count > 2) { i++; } } counterFlag--; } return original; }
  10. 10. April 28, 2012 [LOSSLESS COMPRESSION ENGINE] ‫الخوارزميات‬‫اإلضافية‬ 9 1.1‫خوارزمية‬Method1RLE ‫بتجميع‬ ‫تقوم‬ ‫حيث‬ ‫الصورة‬ ‫في‬ ‫المعلومات‬ ‫تكرار‬ ‫على‬ ‫تعتمد‬ ‫ألنها‬ ‫وذلك‬ ،‫فقط‬ ‫للصور‬ ‫خوارزمية‬ ‫وهي‬ ‫ضمن‬ ‫حدا‬ ‫على‬ ‫سطر‬ ‫كل‬ ‫معلومات‬DataUnits 1.1.1‫الضغط‬ ‫خوارزمية‬ :‫التالية‬ ‫الخوارزمية‬ ‫على‬ ‫الضغط‬ ‫معلومات‬ ‫تجميع‬ ‫يعتمد‬ public static List<List<DataUnit>> EncodeImage(Bitmap imageToEncode, ref CompressionDataInfo info) { TimeChecker timeChecker = new TimeChecker(); timeChecker.S1(); List<List<DataUnit>> compressedStream = new List<List<DataUnit>>(); List<List<Color>> colorArr = ImageManipulator.GetBitmapList(imageToEncode); for (int i = 0; i < colorArr.Count; i++) { Stream currentRow = colorArr[i].Select(color => color.ToArgb().ToString()).ToList(); List<DataUnit> currentRowTokens = TokenizeRow(currentRow); compressedStream.Add(currentRowTokens); } info.EncodingStreamCount = compressedStream.Count; info.TimeEncoding = timeChecker.S2(); return compressedStream; } private static List<DataUnit> TokenizeRow(Stream currentRow) { List<DataUnit> listToReturn = new List<DataUnit>(); for (int i = 0; i < currentRow.Count; i++) { DataUnit dataUnit = RLEBasic.CatchNextTokenEncode(currentRow, i); listToReturn.Add(dataUnit); if (dataUnit.RepeatCounter > 1) { i += dataUnit.RepeatCounter - 1; } } return listToReturn; }
  11. 11. April 28, 2012 [LOSSLESS COMPRESSION ENGINE] ‫الخوارزميات‬‫اإلضافية‬ 10 1.1.1‫الضغط‬ ‫فك‬ ‫خوارزمية‬ ‫المعطيات‬ ‫بنى‬ ‫فك‬ ‫على‬ ‫تعتمد‬ ‫بسيطة‬DataUnits‫جديد‬ ‫من‬ ‫الصورة‬ ‫بناء‬ ‫وإعادة‬ ‫سطر‬ ‫كل‬ ‫في‬ 1.1‫خوارزمية‬Method2RLE ‫فقط‬ ‫للصور‬ ‫خوارزمية‬ ‫وهي‬‫تقوم‬ ‫حيث‬ ‫الصورة‬ ‫في‬ ‫المعلومات‬ ‫تكرار‬ ‫على‬ ‫تعتمد‬ ‫ألنها‬ ‫وذلك‬ ،‫كالسابقة‬ ‫ضمن‬ ‫حدا‬ ‫على‬ ‫سطر‬ ‫كل‬ ‫معلومات‬ ‫بتجميع‬DataUnits‫مشابهة‬‫ما‬ ‫نوعا‬‫لـ‬RLE Method1‫ولكنها‬ ‫بالـ‬ ‫التالي‬ ‫بالسطر‬ ‫والبداية‬ ‫بالسطور‬ ‫اإلحاطة‬ ‫على‬ ‫تعتمد‬index‫وبالتالي‬ ‫الحالي‬ ‫السطر‬ ‫لبداية‬ ‫المعاكس‬ ‫تج‬ ‫محاولة‬‫من‬ ‫أكبر‬ ‫عدد‬ ‫ميع‬.‫المتشابهة‬ ‫األلوان‬ ‫أنها‬ ‫على‬ ‫كاملة‬ ‫الصورة‬ ‫مع‬ ‫وإنما‬ ‫حدا‬ ‫على‬ ‫األسطر‬ ‫مع‬ ‫نتعامل‬ ‫نعد‬ ‫لم‬ ‫هنا‬ ‫أننا‬ ‫نستنتج‬ ‫أننا‬ ‫سبق‬ ‫مما‬ Stream‫عن‬ ‫تماما‬ ‫الضغط‬ ‫وفك‬ ‫الضغط‬ ‫في‬ ‫تختلف‬ ‫وبالتالي‬ ‫نهايتها‬ ‫حتى‬ ‫الصورة‬ ‫بداية‬ ‫من‬ ‫واحد‬ .‫سابقتها‬ 1.1.1‫الضغط‬ ‫خوارزمية‬ ‫بالسطور‬ ‫اإلحاطة‬ ‫على‬ ‫(تعتمد‬ ‫السابق‬ ‫الكالم‬ ‫مع‬ ‫المتفقة‬ ‫السلسلة‬ ‫بتوليد‬ ‫التالية‬ ‫الخوارزمية‬ ‫تقوم‬ ‫حيث‬ ‫بالـ‬ ‫التالي‬ ‫بالسطر‬ ‫والبداية‬index‫من‬ ‫أكبر‬ ‫عدد‬ ‫تجميع‬ ‫محاولة‬ ‫وبالتالي‬ ‫الحالي‬ ‫السطر‬ ‫لبداية‬ ‫المعاكس‬ ‫المتشابهة‬ ‫األلوان‬Wrapping around lines) public static List<DataUnit> EncodeImage(Bitmap imageToEncode, ref CompressionDataInfo info) { TimeChecker timeChecker = new TimeChecker(); timeChecker.S1(); List<DataUnit> compressedStream = new List<DataUnit>(); List<Color> colorArr = RLEMethod2.WrapDataUnitsAroundCorners(ImageManipulator.GetBitmapList(imageToEncode)); List<string> currentRow = colorArr.Select(color => color.ToArgb().ToString()).ToList(); List<DataUnit> currentRowTokens = TokenizeRow(currentRow); compressedStream.AddRange(currentRowTokens); info.EncodingStreamCount = compressedStream.Count; info.TimeEncoding = timeChecker.S2(); return compressedStream; }
  12. 12. April 28, 2012 [LOSSLESS COMPRESSION ENGINE] ‫الخوارزميات‬‫اإلضافية‬ 11 1.1.1‫خوارزمية‬‫فك‬‫الضغط‬ ‫عن‬ ‫عبارة‬ ‫ألنها‬ ‫مرة‬ ‫كل‬ ‫في‬ ‫كامل‬ ‫سطر‬ ‫تجميع‬ ‫فحص‬ ‫مع‬ ‫المعطيات‬ ‫بنى‬ ‫ضغط‬ ‫فك‬ ‫على‬ ‫تعتمد‬ DataUnitStream‫فقط‬ ‫وإنما‬ ‫األسطر‬ ‫على‬ ‫داللة‬ ‫يوجد‬ ‫ال‬ ‫وبالتالي‬Stream‫من‬ ‫الصورة‬ ‫بناء‬ ‫ثم‬ ‫ومن‬ ‫الضغط‬ ‫لفاكك‬ ‫الصورة‬ ‫أبعاد‬ ‫تمرير‬ ‫ضرورة‬ ‫هنا‬ ‫(الحظ‬ .‫جديد‬Decoder‫وتجميع‬ ‫الضغط‬ ‫بفك‬ ‫ليقوم‬ .)‫وعرضها‬ ‫الصورة‬ ‫طول‬ ‫أساس‬ ‫على‬ ‫الصورة‬ ‫أسطر‬ 1.1‫خوارزمية‬QuadTreeRLE ‫لون‬ ‫يحتوي‬ ‫كامل‬ ‫قسم‬ ‫وجود‬ ‫حالة‬ ‫وفحص‬ ‫أقسام‬ ‫أربعة‬ ‫إلى‬ ‫مرة‬ ‫كل‬ ‫في‬ ‫الشجرة‬ ‫تقسيم‬ ‫على‬ ‫تعتمد‬‫واحد‬ ‫قطعة‬ ‫أنه‬ ‫على‬ ‫للشجرة‬ ‫إضافته‬ ‫وبالتالي‬Block‫من‬ ‫أكثر‬ ‫وجود‬ ‫حال‬ ‫في‬ ‫أما‬ ،‫فيه‬ ‫اإلكمال‬ ‫وعدم‬ ‫كامل‬ .‫وهكذا‬ ‫جديد‬ ‫من‬ ‫وفحصهم‬ ‫أقسام‬ ‫ألربعة‬ ‫لتقسيمه‬ ‫القسم‬ ‫هذه‬ ‫على‬ ‫عوديا‬ ‫االستدعاء‬ ‫فيتم‬ ‫لون‬ :‫التالية‬ ‫البنية‬ ‫لها‬ ‫فيها‬ ‫العقدة‬ ‫تكون‬ ‫شجرية‬ ‫بنية‬ ‫هنا‬ ‫لدينا‬ ‫سيكون‬ private static List<Color> WrapDataUnitsAroundCorners(List<List<Color>> listOfDataUnits) { List<Color> listOfWrappedUnits = new List<Color>(); bool isLineEven = true; for (int i = 0; i < listOfDataUnits.Count; i++) { if (isLineEven) { listOfWrappedUnits.AddRange(listOfDataUnits[i]); isLineEven = false; } else { for (int j = listOfDataUnits[i].Count - 1; j >= 0; j--) { listOfWrappedUnits.Add(listOfDataUnits[i][j]); } isLineEven = true; } } return listOfWrappedUnits; } RLETreeNode { RLETreeNode[] _childs; Color _color; bool _isArea; int _i; int _j; int _subArrDim; int _level; Area _area; }
  13. 13. April 28, 2012 [LOSSLESS COMPRESSION ENGINE] ‫الخوارزميات‬‫اإلضافية‬ 12 .‫الضغط‬ ‫فيها‬ ‫يتم‬ ‫والتي‬ ‫الشجرية‬ ‫البنية‬ ‫لدينا‬ ‫ويكون‬ 1.1.1‫خوارزمية‬‫الضغط‬ :‫التالي‬ ‫الشكل‬ ‫لها‬ ‫عودية‬ ‫خوارزمية‬ ‫وهي‬ ‫التابع‬ ‫وفي‬ManipulateChilds‫لوج‬ ‫تبعا‬ ‫الحالية‬ ‫العقدة‬ ‫توليد‬ ‫معالجة‬ ‫يتم‬‫بنفس‬ ‫كاملة‬ ‫مساحة‬ ‫ود‬ ‫لـ‬ ‫تبعا‬ ‫(أي‬ ‫ألوان‬ ‫عدة‬ ‫تحوي‬ ‫منطقة‬ ‫عن‬ ‫معبرة‬ ‫واصلة‬ ‫عقد‬ ‫توليد‬ ‫وبالتالي‬ ‫ال‬ ‫أو‬ ‫اللون‬b1, b2, b3, b4.) private void BuildQuadTreeRecursive(ref RLETreeNode currentBaseNode,int iWidth, int jHeight, double arrSubDim, int currentLevel) { int intArrDim = (int)Math.Ceiling(arrSubDim); Color[,] currentSubArrTopLeft = GetSubArr(iWidth, jHeight, intArrDim, currentLevel, Area.TopLeft); Color[,] currentSubArrTopRight = GetSubArr(iWidth, jHeight, intArrDim, currentLevel, Area.TopRight); Color[,] currentSubArrBottomLeft = GetSubArr(iWidth, jHeight, intArrDim, currentLevel, Area.BottomLeft); Color[,] currentSubArrBottomRight = GetSubArr(iWidth, jHeight, intArrDim, currentLevel, Area.BottomRight); bool b1 = CheckAreaIsBulk(currentSubArrTopLeft); bool b2 = CheckAreaIsBulk(currentSubArrTopRight); bool b3 = CheckAreaIsBulk(currentSubArrBottomLeft); bool b4 = CheckAreaIsBulk(currentSubArrBottomRight); ManipulateChilds(ref currentBaseNode, b1, b2, b3, b4, currentSubArrTopLeft[0, 0], currentSubArrTopRight[0, 0], currentSubArrBottomLeft[0, 0], currentSubArrBottomRight[0, 0], iWidth, jHeight, intArrDim); if (arrSubDim / 2 > 0) { if (!b1) BuildQuadTreeRecursive(ref currentBaseNode.Childs[0], iWidth, jHeight, arrSubDim / 2d, currentLevel + 1); if (!b2) BuildQuadTreeRecursive(ref currentBaseNode.Childs[1], iWidth + intArrDim, jHeight, arrSubDim / 2d, currentLevel + 1); if (!b3) BuildQuadTreeRecursive(ref currentBaseNode.Childs[2], iWidth, jHeight + intArrDim, arrSubDim / 2d, currentLevel + 1); if (!b4) BuildQuadTreeRecursive(ref currentBaseNode.Childs[3], iWidth + intArrDim, jHeight + intArrDim, arrSubDim / 2d, currentLevel + 1); } }
  14. 14. April 28, 2012 [LOSSLESS COMPRESSION ENGINE] ‫الخوارزميات‬‫اإلضافية‬ 13 1.1.1‫خوارزمية‬‫فك‬‫الضغط‬ ( ‫كاملة‬ ‫مساحة‬ ‫هي‬ ‫هل‬ ‫العقدة‬ ‫لنمط‬ ‫تبعا‬ ‫الصورة‬ ‫وبناء‬ ‫الشجرة‬ ‫في‬ ‫التجول‬ ‫على‬ ‫تعتمد‬Area)‫فقط‬ ‫أنها‬ ‫أم‬ ‫عن‬ ‫معبرة‬ ‫عقدة‬ ‫عبارة‬1.‫كاملة‬ ‫الشجرة‬ ‫ضمن‬ ‫عوديا‬ ‫التجول‬ ‫ويتم‬ ‫ألوان‬ ‫عدة‬ ‫من‬ ‫مؤلفة‬ ‫أصغر‬ ‫مناطق‬ ‫الـ‬ ‫أن‬ ‫هنا‬ ‫(نالحظ‬Decoder‫الشجرية‬ ‫البنية‬ ‫ضمن‬ ‫الرئيسية‬ ‫العقدة‬ ‫(باألحرى‬ ‫الشجرية‬ ‫البنية‬ ‫فقط‬ ‫يأخد‬ ‫سلسلة‬ ‫وليس‬ )‫كلها‬ ‫بالشجرة‬ ‫واصلة‬ ‫ألنها‬ ‫فقط‬Stream.)‫لفكها‬ 1.3‫الخوارزميات‬‫القواميس‬ ‫على‬ ‫المعتمدة‬‫المتغيرة‬‫ديناميكي‬ ‫بشكل‬Adaptive Dictionary ‫خوارزميتي‬ ‫هنا‬ ‫سنناقش‬LZ77, LZW. 1.3.1‫خوارزمية‬LZ77 ،‫والنصوص‬ ‫للصور‬ ‫تستخدم‬‫تعتمد‬‫النافذة‬ ‫مبدأ‬ ‫على‬Window‫المحارف‬ ‫لمعالجة‬ ‫المحجوز‬ ‫المكان‬ ‫و‬ ‫قدما‬Lookahead Buffer ‫المعطيات‬ ‫بنية‬ ‫ضمن‬ ‫المعطيات‬ ‫وحفظ‬PhraseToken. ‫النافذة‬Window public void InfiltrateTree(RLETreeNode currentNode, ref Color[,] colorArrRetieved) { foreach (RLETreeNode nodeChild in currentNode.Childs) { if (nodeChild.IsArea) { FillArea(nodeChild, colorArrRetieved); } else { if (nodeChild.Childs[0] == null) { FillArea(nodeChild, colorArrRetieved); } else { InfiltrateTree(nodeChild, ref colorArrRetieved); } } } } SlidingWindow { int _slidingWindowSize; ParitalStream _window; }
  15. 15. April 28, 2012 [LOSSLESS COMPRESSION ENGINE] ‫الخوارزميات‬‫اإلضافية‬ 14 ‫من‬:‫التوابع‬ ‫أهم‬ SlideAhead‫السلسلة‬ ‫ضمن‬ ‫للتقدم‬ :Stream‫الـ‬ ‫لحجم‬ ‫تبعا‬ ‫قدما‬Buffer‫المرادة‬ ‫والخطوة‬ GetBestToken‫الـ‬ ‫لمطابقتهامع‬ ‫وذلك‬ ‫محارف‬ ‫سلسلة‬ ‫أفضل‬ ‫إليجاد‬ ‫وذلك‬ :Buffer ً‫ا‬‫قدم‬ ‫المحجوز‬ ‫المكان‬Buffer :‫التوابع‬ ‫أهم‬ ‫من‬ GetNextStringToken‫السلسلة‬ ‫ضمن‬ ‫للتقدم‬ :Stream‫الـ‬ ‫لحجم‬ ‫تبعا‬ ‫قدما‬Buffer‫المرادة‬ ‫والخطوة‬ ‫المعطيات‬ ‫بنية‬Buffer 1.1.3.3‫خوارزمية‬‫الضغط‬ LookaheadBuffer { int _bufferSize; ParitalStream _buffer; } hraseToken { int _offset; int _matchLength; string _firstPostSymbol; bool _isRawToken; string _strInDictionary; } private List<PhraseToken> EncodeStream(Steam streamOfIds) { List<PhraseToken> encodedStream = new List<PhraseToken>(); for (int i = 0; i < streamOfIds.Count; i++) { Stream nextBufferBlock = _lookaheadBuffer.GetNextStringToken(streamOfIds, i); PhraseToken nextPhraseToken = GetBestToken(i, nextBufferBlock, streamOfIds); if (!nextPhraseToken.IsRawToken) { encodedStream.Add(nextPhraseToken); _slidingWindow.SlideAhead(streamOfIds, i, nextPhraseToken.MatchLength + 1); i += nextPhraseToken.MatchLength; } else { encodedStream.Add(nextPhraseToken); _slidingWindow.SlideAhead(streamOfIds, i, 1); } } return encodedStream; }
  16. 16. April 28, 2012 [LOSSLESS COMPRESSION ENGINE] ‫الخوارزميات‬‫اإلضافية‬ 15 1.1.3.3‫خوارزمية‬‫فك‬‫الضغط‬ 1.3.1‫خوارزمية‬LZW ‫نسخ‬ ‫حفظ‬ ‫وبالتالي‬ "‫السالسل‬ ‫"ألجزاء‬ ‫و‬ ‫للمحارف‬ ‫جدول‬ ‫بناء‬ ‫على‬ ‫تعتمد‬ ،‫والنصوص‬ ‫للصور‬ ‫تستخدم‬ ‫بـ‬ ‫وتعويضها‬ ‫الجدول‬ ‫ضمن‬ ‫المتكررة‬ ‫السالسل‬index‫الـ‬ ‫عند‬ ‫الجدول‬ ‫من‬encoder. ‫الرئيسية‬ ‫األلوان‬ ‫ليضم‬ )‫ّا‬‫ي‬‫جزئ‬ ‫ّئ‬‫ي‬‫مه‬ ‫(جدول‬ ‫للجدول‬ ‫تهيئة‬ ‫عملية‬ ‫إجراء‬ ‫مثال‬ ‫الصور‬ ‫حالة‬ ‫في‬ ‫يتم‬‫ضمن‬ .‫الصورة‬ ‫السلسلة‬ ‫فقط‬ ‫وإنما‬ ‫الضغط‬ ‫ك‬ّ‫ك‬‫لمف‬ ‫إضافة‬ ‫معلومات‬ ‫أية‬ ‫أو‬ ‫الجدول‬ ‫نقل‬ ‫يتم‬ ‫ال‬ ‫أنه‬ ‫الخوارزمية‬ ‫هذه‬ ‫فائدة‬ ‫المرمزة‬Encoded Stream‫على‬ ‫فقط‬ ‫اعتمادا‬ ‫جديد‬ ‫من‬ ‫الجدول‬ ‫بناء‬ ‫الضغط‬ ‫مفكك‬ ‫طرف‬ ‫عند‬ ‫يتم‬ ‫و‬ .‫مسح‬ ‫أول‬ ‫عند‬ ‫بناؤه‬ ‫تم‬ ‫والذي‬ ‫البدائي‬ ‫الجدول‬ private Stream DecodeStream(List<PhraseToken> encodedStream) { Stream decodedStream; for (int i = 0; i < encodedStream.Count; i++) { PhraseToken currentToken = encodedStream[i]; if (currentToken.IsRawToken) { decodedStream.Add(currentToken.StrInDictionary); this.SlidingWindow.SlideAhead(decodedStream, decodedStream.Count - 1, 1); } else { int offset = currentToken.Offset; int matchLength = currentToken.MatchLength; string postSymbol = currentToken.FirstPostSymbol; Stream strDecoded = this.SlidingWindow.GetStringInWindow(offset, matchLength); decodedStream.AddRange(strDecoded); this.SlidingWindow.SlideAhead(decodedStream, decodedStream.Count - strDecoded.Count, strDecoded.Count); if (postSymbol != null) decodedStream.Add(postSymbol); this.SlidingWindow.SlideAhead(decodedStream, decodedStream.Count - 1, 1); } } return decodedStream; }
  17. 17. April 28, 2012 [LOSSLESS COMPRESSION ENGINE] ‫الخوارزميات‬‫اإلضافية‬ 16 1.1.3.3‫خوارزمية‬‫الضغط‬ 1.1.3.3‫فك‬ ‫خوارزمية‬‫الضغط‬ ‫ّز‬‫م‬‫(المر‬ ‫األول‬ ‫الطرف‬ ‫ضمن‬ ‫جزئيا‬ ‫المهيئ‬ ‫الجدول‬ ‫وعلى‬ ‫المرمزة‬ ‫السلسلة‬ ‫على‬ ‫تعتمد‬Encoder) .‫معاكس‬ ‫بشكل‬ ‫ولكن‬ ‫المرمز‬ ‫لعملية‬ ‫مشابهة‬ ‫عملية‬ ‫إجراء‬ ‫ثم‬ ‫ومن‬ private Stream EncodeStream(Stream streamOfIds) { Stream encodedStream = new Stream(); InitializeTableColor(streamOfIds); for (int i = 0; i < streamOfIds.Count; i++) { Stream window = GetNewWindow(streamOfIds, i); if (window.Count > 1) { encodedStream.Add(Table.KeyOf(window.GetRange(0, window.Count - 1)).ToString()); if (!Table.Contains(window)) Table.AddToTable(window); i += window.Count - 2; } else { encodedStream.Add(Table.KeyOf(window.ToList()).ToString()); if (!Table.Contains(window)) Table.AddToTable(window); } } return encodedStream; } Stream DecodeStream(Stream encodedStream) { Stream dencodedStream; Stream strSoFar ; for (int i = 0; i < encodedStream.Count; i++) { int codeKey = Int32.Parse(encodedStream[i]); Stream matchedCodeInTable = Table.GetMatchedSymbol(codeKey); if (matchedCodeInTable == null) { matchedCodeInTable ; matchedCodeInTable.AddRange(strSoFar); matchedCodeInTable.Add(strSoFar[0]); } dencodedStream.AddRange(matchedCodeInTable); if (strSoFar.Count != 0) { Stream listToAdd ; listToAdd.AddRange(strSoFar); listToAdd.Add(matchedCodeInTable[0]); this.Table.AddToTable(listToAdd); } strSoFar.Clear(); strSoFar.AddRange(matchedCodeInTable); } return dencodedStream; }
  18. 18. April 28, 2012 [LOSSLESS COMPRESSION ENGINE] ‫الخوارزميات‬‫اإلضافية‬ 17 1.3‫خوارزمية‬Arithmetic coding ‫الخوارزمية‬‫في‬‫مجاالت‬ ‫يحوي‬ ‫جدول‬ ‫مع‬ ‫استخدامه‬ ‫يتم‬ ‫الدقة‬ ‫متناهي‬ ‫ال‬ ‫حقيقي‬ ‫عدد‬ ‫على‬ ‫تعتمد‬ ‫األساس‬ ‫كل‬،‫الملف‬ ‫في‬ ‫المحارف‬ ‫كل‬ ‫من‬ ‫المحرف‬ ‫هذا‬ ‫تكرار‬ ‫نسبة‬ ‫هو‬ ‫المجال‬ ‫هذا‬ ‫طول‬ ‫حيث‬ ‫لمحرف‬ ‫منها‬ ‫هو‬ ‫المجاالت‬ ‫هذه‬ ‫مجموع‬ ‫وبالتالي‬1.‫والواحد‬ ‫الصفر‬ ‫بين‬ ‫محصور‬ ‫يكون‬ ‫المطلوب‬ ‫الحقيقي‬ ‫والعدد‬ ‫يمكنها‬ ‫وال‬ ‫جدا‬ ‫محدودة‬ ‫الحقيقي‬ ‫المتحول‬ ‫دقة‬ ‫ألن‬ ‫الحاسب‬ ‫على‬ ‫تطبيقها‬ ‫يمكن‬ ‫وال‬ ‫نظرية‬ ‫الطريقة‬ ‫هذه‬ ‫من‬ ‫أكثر‬ ‫ترميز‬11‫تقريبا‬ ‫بايت‬ ‫والتعامل‬ ،‫نسبته‬ ‫وليس‬ ‫المجال‬ ‫في‬ ‫المحرف‬ ‫تكرار‬ ‫مرات‬ ‫عدد‬ ‫تخزين‬ ‫على‬ ‫تعتمد‬ ‫طريفة‬ ‫بالنهاية‬ ‫وجدنا‬ .‫طبيعية‬ ‫كأعداد‬ ‫معها‬ .‫حقيقيا‬ ‫وليس‬ ‫طبيعيا‬ ‫عدد‬ ‫أصبح‬ ‫بالملف‬ ‫االحتفاظ‬ ‫فعليا‬ ‫فيه‬ ‫يتم‬ ‫الذي‬ ‫العدد‬ ‫وبالتالي‬ ‫التي‬ ‫الطريقة‬ ‫بسيط‬ ‫بشكل‬ ‫بالتالي‬ ‫وتختلف‬‫على‬ ‫فيها‬ ‫نحصل‬ ‫التي‬ ‫الطريقة‬ ‫أي‬ ،‫محرف‬ ‫كل‬ ‫ترميز‬ ‫فيها‬ ‫يتم‬ .‫الترميز‬ ‫عدد‬ :‫الترميز‬ ‫خوارزمية‬ :‫الترميز‬ ‫فك‬ ‫خوارزمية‬ while there are still symbols to encode range = high- low + 1 high = low + ((range × high of symbol) / symbol count) - 1 low = low + (range × low of symbol) / symbol count end while while string is not fully decoded range = high - low + 1 encoded value = (encoded value − low) + 1; encoded value = (encoded value × symbol count) ÷ range Get symbol in the current range range = high of symbol - low of symbol + 1 high = low + ((range × high of symbol) / symbol count) - 1 low = low + (range × low of symbol) / symbol count end while
  19. 19. April 28, 2012 [LOSSLESS COMPRESSION ENGINE] ‫بنية‬‫المشروع‬(‫الخوارزميات‬‫اإلضافية‬ ) 18 ‫مشاكل‬‫الخوارزمية‬ ‫على‬ ‫نرمز‬ ‫كنا‬ ‫إذا‬n bits‫مرم‬ ‫المحرف‬ ‫تكرار‬ ‫تعداد‬ ‫تحوي‬ ‫التي‬ ‫المجاالت‬ ‫حدود‬ ‫تكون‬ ‫أن‬ ‫فيجب‬‫على‬ ‫زة‬ n-2 bits ‫أهمية‬ ‫األكثر‬ ‫البت‬ ‫تساوي‬ ‫حال‬ ‫في‬MSB‫المتحولين‬ ‫في‬high, low‫لبتات‬ ‫لليسار‬ ‫إزاحة‬ ‫عمل‬ ‫يجب‬ ‫المتحولين‬ 1‫المشروع‬ ‫بنية‬)‫اإلضافية‬ ‫(الخوارزميات‬ ‫الـ‬ ‫خوارزميات‬ ‫بنية‬RLE ‫القواميس‬ ‫خوارزميات‬ ‫بنية‬
  20. 20. April 28, 2012 [LOSSLESS COMPRESSION ENGINE] ‫بنية‬‫المشروع‬(‫الخوارزميات‬‫اإلضافية‬ ) 19 ‫خوارزمية‬ ‫بنية‬Arithmetic ‫المساعدة‬ ‫البنى‬
  21. 21. April 28, 2012 [LOSSLESS COMPRESSION ENGINE] ‫واجهة‬‫المستخدم‬ 20 3‫واجهة‬‫المستخدم‬ 3.1‫ة‬ّ‫ي‬‫األساس‬ ‫ة‬ّ‫ي‬‫الخوارزم‬ ‫التنفيذي‬ ‫البرنامج‬ ‫نفس‬ ‫على‬ ‫العمل‬ ‫يكون‬ !‫فقط‬ ‫واحد‬ ‫اختيار‬ ‫ومربع‬ ‫زرين‬ ‫على‬ ‫تحوي‬ ،‫ّة‬‫ي‬‫وعمل‬ ‫ّا‬‫د‬‫ج‬ ‫بسيطة‬ ‫األساسي‬ ‫البرنامج‬ ‫واجهة‬ ‫واختيار‬ ‫مختلفين‬ ‫مكانين‬ ‫في‬ ‫بنسخه‬Server.‫اآلخر‬ ‫دون‬ ‫ألحدهما‬ ‫الـ‬ ‫عبر‬ ّ‫م‬‫يت‬ ‫صال‬ّ‫ت‬‫اال‬ ‫زر‬Server‫الـ‬ ّ‫م‬‫ث‬ ‫أوال‬Client‫ونالحظ‬ !‫فقط‬ ‫الوسائط‬ ‫لملفات‬ ‫العرض‬ ‫لكن‬ ،‫ممكنة‬ ‫ملف‬ ‫ألي‬ ‫اإلرسال‬ ‫ّة‬‫ي‬‫وعمل‬ ، ‫ال‬ ‫يستقبل‬ ‫أن‬ ‫قبل‬ ‫ملف‬ ‫أي‬ ‫عرض‬ ‫يمكن‬ ‫ال‬ ‫ه‬ّ‫ن‬‫أ‬ ‫هنا‬Client‫(ال‬ ‫المرسل‬ ‫من‬ ‫الطرود‬Server.) 3.1‫اإلضافية‬ ‫الخوارزميات‬ ‫المشروع‬ ‫يوفر‬‫مع‬ ‫التشغيل‬ ‫وقت‬ ‫أثناء‬ ‫يريد‬ ‫ما‬ ‫إجراء‬ ‫للمستخدم‬ ‫تتيح‬ ‫مرنة‬ ‫تفاعل‬ ‫واجهة‬‫مقارنة‬ .‫منها‬ ‫لكل‬ ‫الضغط‬ ‫وفك‬ ‫الضغط‬ ‫وزمن‬ ‫ونسبة‬ ‫بينها‬ ‫فيما‬ ‫الخوارزميات‬ ‫معا‬ ‫خوارزمية‬ ‫من‬ ‫أكثر‬ ‫تجربة‬ ‫إتاحة‬ :‫الصورة‬ ‫معالجة‬ ‫نافذة‬
  22. 22. April 28, 2012 [LOSSLESS COMPRESSION ENGINE] ‫واجهة‬‫المستخدم‬ 21 ‫خوارزمية‬ ‫كل‬ ‫ضغط‬ ‫معلومات‬ ‫إظهار‬ ‫النصوص‬ ‫معالجة‬ ‫نافذة‬
  23. 23. April 28, 2012 [LOSSLESS COMPRESSION ENGINE] ‫واجهة‬‫المستخدم‬ 22 ‫كسابقتها‬ ‫وتتيح‬‫و‬ ‫ملف‬ ‫من‬ ‫أو‬ ‫فورا‬ ‫نص‬ ‫إضافة‬‫وفك‬ ‫الضغط‬ ‫عملية‬ ‫عن‬ ‫معلومات‬ ‫إظهار‬‫والزمن‬ ‫الضغط‬ .‫إلخ‬ .. ‫الضغظ‬ ‫ونسبة‬ ‫منهما‬ ‫كل‬ ‫في‬ ‫المنقضي‬

×