Download - Adaptive Huffman and Lossless Compression Techniques - Documentation

Transcript
Page 1: Adaptive Huffman and Lossless Compression Techniques - Documentation

4/28/2012

MULTIMEDIA ASSIGNMENT #2 | JAEGER & ZGTR & HASSNOV & POD

محمد شاكرإسماعيل أبو عبد اهلل

مهدي زوجي محمد حسه سرحان

مدحت الصوص

2102

LOSSLESS COMPRESSION ENGINE

Page 2: Adaptive Huffman and Lossless Compression Techniques - Documentation

April 28, 2012 [LOSSLESS COMPRESSION ENGINE]

Adaptive Hoffman 1 خوارزمية

Contents Adaptive Hoffman ................................................................................................................... 3 خوارزمية1

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

1....................................................................................................... الضغط فك اثناء الفيديو عرض 2

VLC Player : ................................................................................................................ 5 استخدام كيفية 1.1

6.................................................................................................................. اإلضافية الخوارزميات 3

6 .................................................................................................................................................. مالحظة

7 ...................................................................................................... (RLEBasic) الرئيسة RLE خوارزمية 3.1

7 ........................................................................................................................ الضغط خورازمية 3.1.1

8.................................................................................................... الضغط فك خوارزمية 3.1.2

Method1 RLE ................................................................................................................... 9خوارزمية 3.1

9 ..................................................................................................................... الضغط خوارزمية 3.2.1

11 ............................................................................................................... الضغط فك خوارزمية 3.2.2

Method2 RLE ................................................................................................................. 11خوارزمية 3.3

11 ....................................................................................................... الضغط خوارزمية 3.3.1

11 .................................................................................................................. الضغط فك خوارزمية 3.3.2

QuadTree RLE................................................................................................................ 11خوارزمية 3.1

11 ....................................................................................................................... الضغط خوارزمية 3.4.1

13 .................................................................................................................. الضغط فك خوارزمية 3.4.2

Adaptive Dictionary....................................... 13 ديناميكي بشكل المتغيرة القواميس على المعتمدة الخوارزميات 3.5

LZ77 ........................................................................................................................ 13 خوارزمية 3.5.1

Window .................................................................................................................................... 13 النافذة

Buffer ..................................................................................................................... 11 قدما المحجوز المكان

Buffer .............................................................................................................................. 11 المعطيات بنية

LZW ........................................................................................................................ 15 خوارزمية 3.5.1

Arithmetic coding ......................................................................................................... 17 خوارزمية 3.6

18 ......................................................................................................... (اإلضافية الخوارزميات) المشروع بنية 1

Page 3: Adaptive Huffman and Lossless Compression Techniques - Documentation

April 28, 2012 [LOSSLESS COMPRESSION ENGINE]

Adaptive Hoffman 2 خوارزمية

11 ...................................................................................................... )الخوارزمّيات جميعها( المستخدم واجهة 5

Page 4: Adaptive Huffman and Lossless Compression Techniques - Documentation

April 28, 2012 [LOSSLESS COMPRESSION ENGINE]

Adaptive Hoffman 3 خوارزمية

Adaptive Hoffmanخوارزمية 1

متشابهان لحد كبير جّدا ، وتشتركان في Adaptive Huffmanالتشفير وفك التشفير في خوارزمّية

خطوات عديدة. تظهر هذه الخطوات في شرح الخوارزمّيتين بشكل عام

خطوات العمل 1.1

خطوات هي:متطابقة بالشكل العام بين التشفير وفك التشفير، وهذه ال -كما ذكرنا سابقا –الخطوات

البحث 1.1.1

البحث عن الرمز المدخل

في حال التشفير يكون هذا الرمز هو بايت، أما في حال فك التشفير فيكون تتابع بتات

التعامل مع ناتج البحث 1.1.1

في حال تّم الوصول لعقدة موجودة سابقا ، يتّم التعامل على أنه ورود جديد للبايت ويتّم زيادة عدد

في حال تّم الوصول لخط مسدود )لم نوجد البايت المطلوب في حال التشفير ، أما1مرات تكراره بمقدار

في حال فك التشفير( فيتّم إضافة عقدة جديدة. Newوالعقدة

تحديث الشجرة 1.1.1

( وتحقّق المرجّو Huffman Treeمن الضروري القيام بتحديق الشجرة لكي تبقى شجرة صالحة )

تين واحد، يبدأ من العقدة المحّدثة أخيرا )أو المضافة حديثا ( من الخوارزمّية، وتحديث الشجرة في الحال

ويصعد ليصل لجذر الشجرة.

إعادة الرمز المناسب 1.1.1

في حال التشفير قد نرد بت أو بايت أو أكثر )تتالي بتات(، أما في حالة فك التشفير فيكون بايت

بالحالة العامة.

التحسينات على الخوارزميّة 1.1

بشكل بطيء دون أي تعديل عليها، وإن بعض التعديالت أو التحسينات قد ال إن الخوارزمّية تعمل

تجعل الخوارزمّية سريعة جّدا لكّنها ترفع سرعتها بشكل ملحوظ.

تابع البحث 1.1

تابع البحث في مرحلة التشفير يبحث في الشجرة كلّها عن العقدة التي تحمل قيمة بايت معّين،

عقدة 156عنصر بينما عملّيا تحتاج للبحث في 511ا إلى وتبحث في شجرة قد يصل عدد عناصره

Page 5: Adaptive Huffman and Lossless Compression Techniques - Documentation

April 28, 2012 [LOSSLESS COMPRESSION ENGINE]

4

على األكثر عملّيا ، حيث ال تهّمها العقد الواصلة، بل فقط األلياف.

عملي جّدا كون كل Dictionary( فإن تخزينها في قاموس 156نظرا للعدد الصغير نسبّيا لأللياف )

نه.منها له مفتاح ممّيز يمّثل رقم البات الذي يعّبر ع

عرض الفيديو اثناء فك الضغط 1

بفك ضغط الملف القادم اليه عن طريق الشبكة, نقوم بتخزين البايتات بعد فك Decoderاثناء قيام الـ

ضغطها في ملف على القرص الصلب, وفي نفس الوقت نقوم بعرض محتويات هذا الملف بشكل

متزامن.

على -او مشغالت الفيديو عموما-الموجودة في بيئة الـدوت نت Componentsنظرا لعدم قدرة الـ

باالضافة الى خوارزمية VLC Playerعرض ملف فيديو اثناء الكتابة فيه قمنا باستخدام مكاتب الـ

بسيط تمكنا من تشغيل الملف وعرض محتواه بشكل متزامن مع فك الضغط.

ن سرعة فك الضغط و الكتابة. فعند تشغيل الملف تكمن المشكلة بأن سرعة قراءة ملف الفديو اسرع م

والوصول الى نهايته يقوم المشغل بايقاف العرض, وذلك لعدم وجود تتمنة بايتات الملف, وقد يرفض

تشغيل الملف لعدم اكتمال ترويسته.

لعرض محتوى الفيديو, وعند توقف VLC Playerالحل المتبع يعتمد على استخدام مكاتب الـ

سبب المذكور انفاَ( نقوم بانتظار فترة زمنية معينة الكتمال كتابة جزء من ملف الفيديو, ثم العرض)لل

نطلب من المشغل العودة بالمحتوى لفترة زمنية قصيرة, وثم نكمل عرض الملف

فقمنا dotnetوالبيئة التي نعمل عليها هي الـ ++cمكتوبة بلغة الـ VLC Playerبما ان مكاتب

الستخدام هذا المكاتب بالشكل التالي P/Invokeريقة الـ باستخدام ط

[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl)] public static extern void libvlc_media_player_play(IntPtr player, ref libvlc_exception_t ex);

Page 6: Adaptive Huffman and Lossless Compression Techniques - Documentation

April 28, 2012 [LOSSLESS COMPRESSION ENGINE]

الضغط فك اثناء الفيديو عرض 5

على ان externاسم المكتبة التي نريد استعمالها. تدل الكلمة المفتاحية DllImportحيث يحدد الـ

التابع التالي معرف في مكتبة خارجية.

: البد ان يوافق اسم التابع هنا اسم التابع المعرف في المكتبة مالحظة

: VLC Playerكيفية استخدام 1.1

libvlc_new باستخدام تابع VLCمن الـ Instanceنقوم بانشاء .1

libvlc_media_newويمثل الملف الذي نود عرضه باستخدام mediaننشئ ما يسمى بالـ .1

( والذي سيقوم بعرض الميديا السابق عن طريق التابع playerنعرف المشغل ) .3

libvlc_media_player_new_from_media

libvlc_media_player_play نطلب من المشغل البدء بالعرض باستخدام التابع .4

يمكن التحكم بالمشغل عن طريق التوابع التالية

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: يحدد النافذة التي نود عرض الفديو عليها

Page 7: Adaptive Huffman and Lossless Compression Techniques - Documentation

April 28, 2012 [LOSSLESS COMPRESSION ENGINE]

اإلضافية الخوارزميات 6

الخوارزميات اإلضافية 1

المحتفظ بالمعلومات قمنا في هذا المشروع بإضافة العديد من الخوارزميات اإلضافية للضغط

.سنذكرها هناوذلك لضغط الصور والنصوص (Lossless Compression) كما هي

مالحظة

staticهي ضمن توابع (Encode/Decodeجميع توابع الخوارزميات )الضغط وفك الضغط

معينة فعلى خوارزمية فك الضغط مثال streamوذلك ألن الضغط وفك الضغط غير متعلق بـ

فك المعطيات مهما تكن شريطة أن تكون مضغوطة بنفس خوارزمية الضغط المقابلة لها

فقط دون العلم بمحتواها إطالقا . streamوبالتالي لها نفس بنية الـ

Page 8: Adaptive Huffman and Lossless Compression Techniques - Documentation

April 28, 2012 [LOSSLESS COMPRESSION ENGINE]

اإلضافية الخوارزميات 7

(RLEBasicالرئيسة ) RLEخوارزمية 1.1

تكرار مرور المحرف وإضافته تعتمد على حفظ عدد وهو خوارزمية للنصوص والصور،

ضغوطات. 8أصفار تضاف مع كل إتمام 8للسلسلة المضغوطة مع

لحفظ التكرارات: DataUnitالبنية RLEنستخدم في جميع خوارزميات الـ

الضغط خورازمية 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;

}

Page 9: Adaptive Huffman and Lossless Compression Techniques - Documentation

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; }

Page 10: Adaptive Huffman and Lossless Compression Techniques - Documentation

April 28, 2012 [LOSSLESS COMPRESSION ENGINE]

اإلضافية الخوارزميات 9

Method1 RLEخوارزمية 1.1

وهي خوارزمية للصور فقط، وذلك ألنها تعتمد على تكرار المعلومات في الصورة حيث تقوم بتجميع

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; }

Page 11: Adaptive Huffman and Lossless Compression Techniques - Documentation

April 28, 2012 [LOSSLESS COMPRESSION ENGINE]

اإلضافية الخوارزميات 10

خوارزمية فك الضغط 1.1.1

في كل سطر وإعادة بناء الصورة من جديد DataUnitsبسيطة تعتمد على فك بنى المعطيات

Method2 RLEخوارزمية 1.1

كالسابقة، وذلك ألنها تعتمد على تكرار المعلومات في الصورة حيث تقوم وهي خوارزمية للصور فقط

ولكنها RLE Method1لـ نوعا ما مشابهة DataUnitsبتجميع معلومات كل سطر على حدا ضمن

المعاكس لبداية السطر الحالي وبالتالي 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; }

Page 12: Adaptive Huffman and Lossless Compression Techniques - Documentation

April 28, 2012 [LOSSLESS COMPRESSION ENGINE]

اإلضافية الخوارزميات 11

الضغط فك خوارزمية 1.1.1

تعتمد على فك ضغط بنى المعطيات مع فحص تجميع سطر كامل في كل مرة ألنها عبارة عن

DataUnitStream وبالتالي ال يوجد داللة على األسطر وإنما فقطStream ومن ثم بناء الصورة من

ليقوم بفك الضغط وتجميع Decoderجديد. )الحظ هنا ضرورة تمرير أبعاد الصورة لفاكك الضغط

أسطر الصورة على أساس طول الصورة وعرضها(.

QuadTree RLEخوارزمية 1.1

واحد تعتمد على تقسيم الشجرة في كل مرة إلى أربعة أقسام وفحص حالة وجود قسم كامل يحتوي لون

كامل وعدم اإلكمال فيه، أما في حال وجود أكثر من 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; }

Page 13: Adaptive Huffman and Lossless Compression Techniques - Documentation

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); } }

Page 14: Adaptive Huffman and Lossless Compression Techniques - Documentation

April 28, 2012 [LOSSLESS COMPRESSION ENGINE]

اإلضافية الخوارزميات 13

الضغط فك خوارزمية 1.1.1

أم أنها فقط (Areaتعتمد على التجول في الشجرة وبناء الصورة تبعا لنمط العقدة هل هي مساحة كاملة )

مناطق أصغر مؤلفة من عدة ألوان ويتم التجول عوديا ضمن الشجرة كاملة. 1عبارة عقدة معبرة عن

يأخد فقط البنية الشجرية )باألحرى العقدة الرئيسية ضمن البنية الشجرية Decoder)نالحظ هنا أن الـ

لفكها(. Streamفقط ألنها واصلة بالشجرة كلها( وليس سلسلة

Adaptive Dictionaryبشكل ديناميكي المتغيرة المعتمدة على القواميس الخوارزميات 1.3

.LZ77, LZWسنناقش هنا خوارزميتي

LZ77 خوارزمية 1.3.1

و المكان المحجوز لمعالجة المحارف 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; }

Page 15: Adaptive Huffman and Lossless Compression Techniques - Documentation

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; }

Page 16: Adaptive Huffman and Lossless Compression Techniques - Documentation

April 28, 2012 [LOSSLESS COMPRESSION ENGINE]

اإلضافية الخوارزميات 15

الضغطفك خوارزمية 1.1.3.3

LZW خوارزمية 1.3.1

تستخدم للصور والنصوص، تعتمد على بناء جدول للمحارف و "ألجزاء السالسل" وبالتالي حفظ نسخ

.encoderمن الجدول عند الـ indexالسالسل المتكررة ضمن الجدول وتعويضها بـ

ضمن يتم في حالة الصور مثال إجراء عملية تهيئة للجدول )جدول مهّيئ جزئّيا ( ليضم األلوان الرئيسية

الصورة.

فائدة هذه الخوارزمية أنه ال يتم نقل الجدول أو أية معلومات إضافة لمفّكك الضغط وإنما فقط السلسلة

و يتم عند طرف مفكك الضغط بناء الجدول من جديد اعتمادا فقط على 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; }

Page 17: Adaptive Huffman and Lossless Compression Techniques - Documentation

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; }

Page 18: Adaptive Huffman and Lossless Compression Techniques - Documentation

April 28, 2012 [LOSSLESS COMPRESSION ENGINE]

اإلضافية الخوارزميات 17

Arithmetic codingخوارزمية 1.3

األساس تعتمد على عدد حقيقي ال متناهي الدقة يتم استخدامه مع جدول يحوي مجاالت في الخوارزمية

منها لمحرف حيث طول هذا المجال هو نسبة تكرار هذا المحرف من كل المحارف في الملف، كل

والعدد الحقيقي المطلوب يكون محصور بين الصفر والواحد. 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

Page 19: Adaptive Huffman and Lossless Compression Techniques - Documentation

April 28, 2012 [LOSSLESS COMPRESSION ENGINE]

اإلضافية الخوارزميات) المشروع بنية ) 18

الخوارزمية مشاكل

زة على فيجب أن تكون حدود المجاالت التي تحوي تعداد تكرار المحرف مرم n bitsإذا كنا نرمز على

n-2 bits

يجب عمل إزاحة لليسار لبتات high, lowفي المتحولين MSBفي حال تساوي البت األكثر أهمية

المتحولين

)الخوارزميات اإلضافية(بنية المشروع 1

RLEبنية خوارزميات الـ

بنية خوارزميات القواميس

Page 20: Adaptive Huffman and Lossless Compression Techniques - Documentation

April 28, 2012 [LOSSLESS COMPRESSION ENGINE]

اإلضافية الخوارزميات) المشروع بنية ) 19

Arithmeticبنية خوارزمية

البنى المساعدة

Page 21: Adaptive Huffman and Lossless Compression Techniques - Documentation

April 28, 2012 [LOSSLESS COMPRESSION ENGINE]

المستخدم واجهة 20

المستخدمواجهة 3

الخوارزميّة األساسيّة 3.1

واجهة البرنامج األساسي بسيطة جّدا وعملّية، تحوي على زرين ومربع اختيار واحد فقط! يكون العمل على نفس البرنامج التنفيذي

ألحدهما دون اآلخر. Serverبنسخه في مكانين مختلفين واختيار

، وعملّية اإلرسال ألي ملف ممكنة، لكن العرض لملفات الوسائط فقط! ونالحظ Clientأوال ثّم الـ Serverزر االّتصال يتّم عبر الـ

(.Serverالطرود من المرسل )ال Clientهنا أّنه ال يمكن عرض أي ملف قبل أن يستقبل ال

الخوارزميات اإلضافية 3.1

مقارنة واجهة تفاعل مرنة تتيح للمستخدم إجراء ما يريد أثناء وقت التشغيل مع يوفر المشروع

الخوارزميات فيما بينها ونسبة وزمن الضغط وفك الضغط لكل منها.

نافذة معالجة الصورة: إتاحة تجربة أكثر من خوارزمية معا

Page 22: Adaptive Huffman and Lossless Compression Techniques - Documentation

April 28, 2012 [LOSSLESS COMPRESSION ENGINE]

المستخدم واجهة 21

إظهار معلومات ضغط كل خوارزمية

نافذة معالجة النصوص

Page 23: Adaptive Huffman and Lossless Compression Techniques - Documentation

April 28, 2012 [LOSSLESS COMPRESSION ENGINE]

المستخدم واجهة 22

الضغط والزمن إظهار معلومات عن عملية الضغط وفك إضافة نص فورا أو من ملف و وتتيح كسابقتها

المنقضي في كل منهما ونسبة الضغظ .. إلخ.