เครื่องมือพัฒนา 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 |