معالجة ضغط بيانات دلفي(1)
تعد أداة تطوير 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 الخاص بهم.
جزء من الكود المصدري للبرنامج كما يلي:
الوحدة 1؛
واجهة
الاستخدامات
Windows، الرسائل، SysUtils، الفئات، الرسومات، عناصر التحكم، النماذج، مربعات الحوار، StdCtrls، Zlib؛
يكتب
TForm1 = الفئة (TForm)
Button1: TButton؛
Button2: TButton؛
الإجراء Button1Click(Sender: TObject);
الإجراء Button2Click(Sender: TObject);
خاص
{تصريحات خاصة}
عام
{التصريحات العامة}
نهاية؛
فار
Form1: TForm1؛
تطبيق
{$ ر* .DFM}
1. التقاط صورة ملء الشاشة
الإجراء GetScreen(var Bmp: TBitmap);
فار
العاصمة: HDC؛
MyCanvas: TCanvas؛
MyRect: TRect؛
يبدأ
Dc := GetWindowDC(0);
MyCanvas := TCanvas.Create;
يحاول
MyCanvas.Handle := Dc;
MyRect:=Rect(0, 0,Screen.Width, Screen.Height);
file://الصورة ذات لون حقيقي 24 بت ويمكن أيضًا تعديلها وفقًا للاحتياجات الفعلية
Bmp.PixelFormat := pf24bit;
Bmp.Width := MyRect.Right;
Bmp.Height := MyRect.Bottom;
الملف: // التقاط صورة الشاشة بأكملها
Bmp.Canvas.CopyRect(MyRect, MyCanvas, MyRect);
أخيراً
MyCanvas.Handle := 0;
MyCanvas.Free;
ReleaseDC(0, Dc);
نهاية؛
نهاية؛
2. ضغط الصور
الإجراء CompressBitmap(var CompressedStream: TMemoryStream;const CompressionLevel: TCompressionLevel);
فار
مصدر: TCompressionStream؛
DestStream: TMemoryStream;
العدد: عدد صحيح؛
يبدأ
file://يحصل على الحجم الأصلي لدفق الصور
Count := CompressedStream.Size;
DestStream := TMemoryStream.Create;
SourceStream:=TCompressionStream.Create
(مستوى الضغط، ديستستريم)؛
يحاول
يتم تخزين دفق الصورة الأصلي في الملف://SourceStream
CompressedStream.SaveToStream(SourceStream);
file:// يضغط دفق الصورة الأصلي، ويتم تخزين دفق الصورة المضغوطة في DestStream
SourceStream.Free؛
CompressedStream.Clear;
file://يكتب أبعاد الصورة الأصلية
CompressedStream.WriteBuffer(Count, SizeOf
(عدد))؛
ملف://اكتب دفق الصور المضغوطة
CompressedStream.CopyFrom(DestStream, 0);
أخيراً
DestStream.Free;
نهاية؛
نهاية؛
3. استعادة الصور المضغوطة
الإجراء UnCompressBitmap(const CompressedStream: TFileStream; var Bmp: TBitmap);
فار
SourceStream: TDecompressionStream؛
DestStream: TMemoryStream;