تعد أداة تطوير RAD Delphi 5.0 التي أطلقتها شركة Borland أداة تطوير رئيسية على نظام Windows الأساسي، وقد اجتذبت بيئة التطوير المرئية ووظائف البرمجة القوية الموجهة للكائنات عددًا لا يحصى من المطورين. ومع ذلك، غالبًا ما يواجه بعض المبرمجين صعوبة في ضغط كميات كبيرة من البيانات أثناء عملية التطوير الفعلية، ويتعين عليهم العثور على بعض خوارزميات الضغط الفعالة أو البحث عن عناصر تحكم تابعة لجهات خارجية على الإنترنت لتحقيق الضغط. ألا توفر دلفي نفسها هذه الوظيفة؟ في الواقع، لقد فكر مبرمجو دلفي في هذا الأمر بالفعل، فقدموا ملفين للوحدة، Zlib.pas وZlibconst.pas، لحل مشكلة ضغط البيانات وتحقيق نسبة ضغط عالية للبيانات. يتم حفظ هذين الملفين في دليل InfoExtras lib على القرص المضغوط الخاص بتثبيت Delphi 5.0. بالإضافة إلى ذلك، يتم أيضًا حفظ ملف Obj المشار إليه بواسطة وحدة Zlib.pas في دليل InfoExtras libObj. تتناول المقالة التالية ضغط نسخة الشاشة كمثال لتقديم كيفية استخدام هذه الوظيفة.
أولاً، استخدم نسخة الشاشة لالتقاط الصورة الحالية للشاشة بأكملها، ثم احفظها في الذاكرة بتنسيق ملف BMP. عند الضغط، استخدم كائن TComPRessionStream لضغط الصورة الأصلية وحفظها بتنسيق ملف مخصص؛ عند فك الضغط، استخدم كائن TDecompressionStream لفك ضغط الصورة المضغوطة واستعادتها إلى ملف صورة بتنسيق BMP. |
قم بإنشاء ملف مشروع جديد، وقم بالإشارة إلى Zlib.pas في جزء الواجهة من الوحدة الرئيسية، ثم ضع الزرين Button1 و Button2 في النموذج الرئيسي، واكتب رمز استدعاء الإجراء المقابل في حدث OnClick الخاص بهم. |
جزء من الكود المصدري للبرنامج كما يلي: |
Windows، الرسائل، SysUtils، الفئات، الرسومات، عناصر التحكم، النماذج، مربعات الحوار، StdCtrls، Zlib؛ |
الإجراء Button1Click(Sender: TObject); |
الإجراء Button2Click(Sender: TObject); |
1. التقاط صورة ملء الشاشة |
الإجراء GetScreen(var Bmp: TBitmap); |
MyCanvas := TCanvas.Create; |
MyRect:=Rect(0, 0,Screen.Width, Screen.Height); |
// الصورة ذات لون حقيقي 24 بت، ويمكن تعديلها أيضًا وفقًا للاحتياجات الفعلية. |
Bmp.PixelFormat := pf24bit; |
Bmp.Width := MyRect.Right; |
Bmp.Height := MyRect.Bottom; |
// التقط صورة الشاشة بأكملها |
Bmp.Canvas.CopyRect(MyRect, MyCanvas, MyRect); |
الإجراء CompressBitmap(var CompressedStream: TMemoryStream;const CompressionLevel: TCompressionLevel); |
مصدر: TCompressionStream؛ |
DestStream: TMemoryStream; |
// احصل على الحجم الأصلي لدفق الصورة |
Count := CompressedStream.Size; |
DestStream := TMemoryStream.Create; |
SourceStream:=TCompressionStream.Create |
(مستوى الضغط، ديستستريم)؛ |
// SourceStream يخزن دفق الصورة الأصلي |
CompressedStream.SaveToStream(SourceStream); |
// ضغط دفق الصورة الأصلي، ويتم تخزين دفق الصورة المضغوطة في DestStream. |
//اكتب حجم الصورة الأصلية |
CompressedStream.WriteBuffer(Count, SizeOf |
// اكتب دفق الصورة المضغوطة |
CompressedStream.CopyFrom(DestStream, 0); |
3. استعادة الصور المضغوطة |
الإجراء UnCompressBitmap(const CompressedStream: TFileStream; var Bmp: TBitmap); |
SourceStream: TDecompressionStream؛ |
DestStream: TMemoryStream; |
// اقرأ حجم الصورة الأصلية من دفق الصور المضغوطة |
CompressedStream.ReadBuffer(Count, SizeOf(Count)); |
// تخصيص كتل الذاكرة لقراءة دفق الصورة الأصلي وفقًا لحجم الصورة |
DestStream := TMemoryStream.Create; |
SourceStream := TDecompressionStream.Create(CompressedStream); |
// قم بفك ضغط تدفق الصور المضغوطة وتخزينها في كتلة ذاكرة المخزن المؤقت |
SourceStream.ReadBuffer(Buffer^, Count); |
// احفظ دفق الصورة الأصلي في دفق DestStream |
DestStream.WriteBuffer(Buffer^, Count); |
DestStream.Position := 0;// إعادة تعيين مؤشر الدفق |
// قم بتحميل دفق الصورة الأصلي من دفق DestStream |
Bmp.LoadFromStream(DestStream); |
4. حدث عند النقر على زر الضغط |
الإجراء TForm1.Button1Click(Sender: TObject); |
البث المضغوط: TMemoryStream؛ |
CompressedStream := TMemoryStream.Create; |
// التقط الشاشة الحالية بأكملها واحفظ الصورة في كائن Bmp GetScreen(Bmp); |
// احفظ الصورة في كائن Bmp في دفق الذاكرة |
Bmp.SaveToStream(CompressedStream); |
// ضغط دفق الصورة الأصلي وفقًا لنسبة الضغط الافتراضية |
CompressBitmap(CompressedStream, clDefault); |
// احفظ دفق الصور المضغوطة في ملف بتنسيق مخصص |
CompressedStream.SaveToFile('C:cj.dat' ); |
5. حدث فك ضغط الزر عند النقر |
الإجراء TForm1.Button2Click(Sender: TObject); |
// افتح ملفًا بتنسيق مضغوط مخصصًا في وضع القراءة فقط لدفق الملف |
CompressedStream := TFileStream.Create(' C:cj.dat' , fmOpenRead); |
// قم بفك ضغط دفق الصور المضغوطة |
UnCompressBitmap(CompressedStream, Bmp); |
// استعادة دفق الصورة الأصلية إلى ملف BMP المحدد |
Bmp.SaveToFile('C:cj.bmp' ); |
بالإضافة إلى ذلك، يوفر كائن TCompressionStream أيضًا خاصية CompressionRate، والتي يتم استخدامها لوصف نسبة الضغط بعد ضغط البيانات الأصلية. يتم تشغيل حدث OnProgress أثناء عمليات الضغط وإلغاء الضغط. يمكن للمطورين الكتابة في هذا الحدث لعرض التقدم . |
يمرر الكود أعلاه تصحيح الأخطاء ويعمل في دلفي 5.0. |