4/28/2012 MULTIMEDIA ASSIGNMENT #2 | JAEGER & ZGTR & HASSNOV & POD و عبد ا إسماعيل أبحمد شاكر مه سرحانمد حس مح زوجي مهديوص مدحت الص2102 LOSSLESS COMPRESSION ENGINE
May 14, 2015
4/28/2012
MULTIMEDIA ASSIGNMENT #2 | JAEGER & ZGTR & HASSNOV & POD
محمد شاكرإسماعيل أبو عبد اهلل
مهدي زوجي محمد حسه سرحان
مدحت الصوص
2102
LOSSLESS COMPRESSION ENGINE
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
April 28, 2012 [LOSSLESS COMPRESSION ENGINE]
Adaptive Hoffman 2 خوارزمية
11 ...................................................................................................... )الخوارزمّيات جميعها( المستخدم واجهة 5
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ا إلى وتبحث في شجرة قد يصل عدد عناصره
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);
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: يحدد النافذة التي نود عرض الفديو عليها
April 28, 2012 [LOSSLESS COMPRESSION ENGINE]
اإلضافية الخوارزميات 6
الخوارزميات اإلضافية 1
المحتفظ بالمعلومات قمنا في هذا المشروع بإضافة العديد من الخوارزميات اإلضافية للضغط
.سنذكرها هناوذلك لضغط الصور والنصوص (Lossless Compression) كما هي
مالحظة
staticهي ضمن توابع (Encode/Decodeجميع توابع الخوارزميات )الضغط وفك الضغط
معينة فعلى خوارزمية فك الضغط مثال streamوذلك ألن الضغط وفك الضغط غير متعلق بـ
فك المعطيات مهما تكن شريطة أن تكون مضغوطة بنفس خوارزمية الضغط المقابلة لها
فقط دون العلم بمحتواها إطالقا . streamوبالتالي لها نفس بنية الـ
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;
}
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; }
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; }
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; }
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; }
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); } }
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; }
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; }
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; }
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; }
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
April 28, 2012 [LOSSLESS COMPRESSION ENGINE]
اإلضافية الخوارزميات) المشروع بنية ) 18
الخوارزمية مشاكل
زة على فيجب أن تكون حدود المجاالت التي تحوي تعداد تكرار المحرف مرم n bitsإذا كنا نرمز على
n-2 bits
يجب عمل إزاحة لليسار لبتات high, lowفي المتحولين MSBفي حال تساوي البت األكثر أهمية
المتحولين
)الخوارزميات اإلضافية(بنية المشروع 1
RLEبنية خوارزميات الـ
بنية خوارزميات القواميس
April 28, 2012 [LOSSLESS COMPRESSION ENGINE]
اإلضافية الخوارزميات) المشروع بنية ) 19
Arithmeticبنية خوارزمية
البنى المساعدة
April 28, 2012 [LOSSLESS COMPRESSION ENGINE]
المستخدم واجهة 20
المستخدمواجهة 3
الخوارزميّة األساسيّة 3.1
واجهة البرنامج األساسي بسيطة جّدا وعملّية، تحوي على زرين ومربع اختيار واحد فقط! يكون العمل على نفس البرنامج التنفيذي
ألحدهما دون اآلخر. Serverبنسخه في مكانين مختلفين واختيار
، وعملّية اإلرسال ألي ملف ممكنة، لكن العرض لملفات الوسائط فقط! ونالحظ Clientأوال ثّم الـ Serverزر االّتصال يتّم عبر الـ
(.Serverالطرود من المرسل )ال Clientهنا أّنه ال يمكن عرض أي ملف قبل أن يستقبل ال
الخوارزميات اإلضافية 3.1
مقارنة واجهة تفاعل مرنة تتيح للمستخدم إجراء ما يريد أثناء وقت التشغيل مع يوفر المشروع
الخوارزميات فيما بينها ونسبة وزمن الضغط وفك الضغط لكل منها.
نافذة معالجة الصورة: إتاحة تجربة أكثر من خوارزمية معا
April 28, 2012 [LOSSLESS COMPRESSION ENGINE]
المستخدم واجهة 21
إظهار معلومات ضغط كل خوارزمية
نافذة معالجة النصوص
April 28, 2012 [LOSSLESS COMPRESSION ENGINE]
المستخدم واجهة 22
الضغط والزمن إظهار معلومات عن عملية الضغط وفك إضافة نص فورا أو من ملف و وتتيح كسابقتها
المنقضي في كل منهما ونسبة الضغظ .. إلخ.