เครื่องมือพัฒนา 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 |
ส่วนหนึ่งของซอร์สโค้ดโปรแกรมมีดังนี้: |
Windows, ข้อความ, SysUtils, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม, ไดอะล็อก, StdCtrls, Zlib; |
ขั้นตอน Button1Click (ผู้ส่ง: TObject); |
ขั้นตอน Button2Click (ผู้ส่ง: TObject); |
ขั้นตอน GetScreen (var Bmp: TBitmap); |
กระแสตรง := GetWindowDC(0); |
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; |
//รับขนาดดั้งเดิมของสตรีมรูปภาพ |
จำนวน := CompressedStream.Size; |
DestStream := TMemoryStream.Create; |
SourceStream:=TCompressionStream.Create |
(ระดับการบีบอัด, DestStream); |
//SourceStream เก็บสตรีมรูปภาพต้นฉบับ |
CompressedStream.SaveToStream (SourceStream); |
//บีบอัดสตรีมรูปภาพต้นฉบับ และสตรีมรูปภาพที่บีบอัดจะถูกจัดเก็บไว้ใน DestStream |
CompressedStream.WriteBuffer (นับ, SizeOf |
CompressedStream.CopyFrom(DestStream, 0); |
ขั้นตอน UnCompressBitmap (const CompressedStream: TFileStream; var Bmp: TBitmap); |
SourceStream: TDecompressionStream; |
DestStream: TMemoryStream; |
//อ่านขนาดของภาพต้นฉบับจากสตรีมภาพที่บีบอัด |
CompressedStream.ReadBuffer (นับ, SizeOf (นับ)); |
//จัดสรรบล็อกหน่วยความจำสำหรับสตรีมรูปภาพต้นฉบับเพื่ออ่านตามขนาดรูปภาพ |
DestStream := TMemoryStream.Create; |
SourceStream := TDecompressionStream.Create (CompressedStream); |
//ขยายขนาดสตรีมภาพที่บีบอัดและจัดเก็บไว้ในบล็อกหน่วยความจำบัฟเฟอร์ |
SourceStream.ReadBuffer (บัฟเฟอร์ ^, นับ); |
//บันทึกสตรีมรูปภาพต้นฉบับไปที่สตรีม DestStream |
DestStream.WriteBuffer (บัฟเฟอร์ ^, นับ); |
DestStream.Position := 0;//รีเซ็ตตัวชี้สตรีม |
//โหลดสตรีมรูปภาพต้นฉบับจากสตรีม DestStream |
Bmp.LoadFromStream(DestStream); |
4. ปุ่มบีบอัดเหตุการณ์ OnClick |
ขั้นตอน TForm1.Button1Click (ผู้ส่ง: TObject); |
สตรีมที่บีบอัด: TMemoryStream; |
CompressedStream := TMemoryStream.Create; |
//จับภาพหน้าจอปัจจุบันทั้งหมดและบันทึกภาพลงในวัตถุ Bmp GetScreen(Bmp); |
//บันทึกรูปภาพในวัตถุ Bmp ไปยังสตรีมหน่วยความจำ |
Bmp.SaveToStream(บีบอัดสตรีม); |
//บีบอัดสตรีมภาพต้นฉบับตามอัตราส่วนการบีบอัดเริ่มต้น |
CompressBitmap(CompressedStream, clDefault); |
//บันทึกสตรีมภาพที่บีบอัดลงในไฟล์รูปแบบที่กำหนดเอง |
CompressedStream.SaveToFile(' C:cj.dat' ); |
5. ปุ่มคลายซิปเหตุการณ์ OnClick |
ขั้นตอน TForm1.Button2Click (ผู้ส่ง: TObject); |
สตรีมที่บีบอัด: TFileStream; |
//เปิดไฟล์รูปแบบการบีบอัดแบบกำหนดเองในโหมดอ่านอย่างเดียวของสตรีมไฟล์ |
CompressedStream := TFileStream.Create(' C:cj.dat' , fmOpenRead); |
// คลายการบีบอัดสตรีมภาพที่บีบอัด |
UnCompressBitmap (บีบอัดสตรีม, Bmp); |
// คืนค่าสตรีมรูปภาพต้นฉบับเป็นไฟล์ BMP ที่ระบุ |
Bmp.SaveToFile(' C:cj.bmp' ); |
นอกจากนี้ อ็อบเจ็กต์ TCompressionStream ยังมีคุณสมบัติ CompressionRate ซึ่งใช้เพื่ออธิบายอัตราส่วนการบีบอัดหลังจากการบีบอัดข้อมูลต้นฉบับ เหตุการณ์ OnProgress จะถูกทริกเกอร์ในระหว่างกระบวนการบีบอัดและคลายการบีบอัด นักพัฒนาสามารถเขียนในเหตุการณ์นี้เพื่อแสดงความคืบหน้าได้ . |
โค้ดด้านบนผ่านการดีบักและทำงานใน Delphi 5.0 |