การประมวลผลการบีบอัดข้อมูล Delphi(1)
เครื่องมือพัฒนา RAD Delphi 5.0 ที่เปิดตัวโดย Borland Company เป็นเครื่องมือพัฒนากระแสหลักบนแพลตฟอร์ม Windows อย่างไรก็ตาม โปรแกรมเมอร์บางคนมักประสบปัญหาในการบีบอัดข้อมูลจำนวนมากในระหว่างกระบวนการพัฒนาจริง และต้องหาอัลกอริธึมการบีบอัดที่มีประสิทธิภาพหรือค้นหาการควบคุมของบุคคลที่สามบนอินเทอร์เน็ตเพื่อให้ได้การบีบอัด Delphi เองก็ไม่มีฟังก์ชั่นนี้ให้ใช่ไหม? ในความเป็นจริง โปรแกรมเมอร์ Delphi ได้พิจารณาเรื่องนี้แล้ว พวกเขาจัดเตรียมไฟล์ยูนิตสองไฟล์ ได้แก่ 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: T ปุ่ม;
Button2: T ปุ่ม;
ขั้นตอน Button1Click (ผู้ส่ง: TObject);
ขั้นตอน Button2Click (ผู้ส่ง: TObject);
ส่วนตัว
{ประกาศส่วนตัว}
สาธารณะ
{ประกาศสาธารณะ}
จบ;
var
แบบฟอร์ม 1: TForm1;
การดำเนินการ
{$ R* .DFM}
1. จับภาพแบบเต็มหน้าจอ
ขั้นตอน GetScreen (var Bmp: TBitmap);
var
ดีซี: HDC;
MyCanvas: TCanvas;
MyRect: TRect;
เริ่ม
กระแสตรง := 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.ฟรี;
ปล่อยDC(0, Dc);
จบ;
จบ;
2. บีบอัดรูปภาพ
ขั้นตอน CompressBitmap (var CompressedStream: TMemoryStream; const CompressionLevel: TCompressionLevel);
var
กระแสที่มา: TCompressionStream;
DestStream: TMemoryStream;
นับ: จำนวนเต็ม;
เริ่ม
file://gets ขนาดดั้งเดิมของสตรีมภาพ
จำนวน := CompressedStream.Size;
DestStream := TMemoryStream.Create;
SourceStream:=TCompressionStream.Create
(ระดับการบีบอัด, DestStream);
พยายาม
สตรีมรูปภาพต้นฉบับถูกจัดเก็บไว้ใน file://SourceStream
CompressedStream.SaveToStream (SourceStream);
file://compresses สตรีมรูปภาพต้นฉบับ และสตรีมรูปภาพที่บีบอัดจะถูกจัดเก็บไว้ใน DestStream
SourceStream.ฟรี;
CompressedStream.Clear;
file://เขียนขนาดของภาพต้นฉบับ
CompressedStream.WriteBuffer (นับ, SizeOf
(นับ));
file://เขียนสตรีมภาพที่บีบอัด
CompressedStream.CopyFrom(DestStream, 0);
ในที่สุด
DestStream.ฟรี;
จบ;
จบ;
3. คืนค่าภาพที่บีบอัด
ขั้นตอน UnCompressBitmap (const CompressedStream: TFileStream; var Bmp: TBitmap);
var
SourceStream: TDecompressionStream;
DestStream: TMemoryStream;