Borland Company가 출시한 RAD 개발 도구 Delphi 5.0은 Windows 플랫폼의 주류 개발 도구로, 시각적 개발 환경과 강력한 객체 지향 프로그래밍 기능으로 수많은 개발자의 관심을 끌었습니다. 그러나 일부 프로그래머는 실제 개발 과정에서 많은 양의 데이터를 압축하는 데 어려움을 겪는 경우가 많으며 압축을 위해 효율적인 압축 알고리즘을 찾거나 인터넷에서 타사 컨트롤을 검색해야 합니다. 델파이 자체에서 이 기능을 제공하지 않나요? 실제로 델파이 프로그래머들은 데이터 압축 문제를 해결하고 높은 데이터 압축률을 달성하기 위해 두 개의 유닛 파일인 Zlib.pas와 Zlibconst.pas를 이미 고려했습니다. 이 두 파일은 Delphi 5.0 설치 CD의 InfoExtras lib 디렉터리에 저장됩니다. 또한 Zlib.pas 유닛에서 참조하는 Obj 파일도 InfoExtras libObj 디렉터리에 저장됩니다. 다음 문서에서는 화면 복사본 압축을 예로 들어 이 기능을 사용하는 방법을 소개합니다.
먼저, 화면 복사를 이용하여 전체 화면의 현재 이미지를 캡쳐한 후 BMP 파일 형식으로 메모리에 저장합니다. 압축할 때는 TComPRessionStream 개체를 사용하여 원본 이미지를 압축하고 사용자 정의 파일 형식으로 저장하고, 압축을 풀 때는 TDecompressionStream 개체를 사용하여 압축된 이미지의 압축을 풀고 BMP 형식 이미지 파일로 복원합니다. |
새 프로젝트 파일을 생성하고, 메인 유닛의 인터페이스 부분에서 Zlib.pas를 참조하고, 메인 폼에 두 개의 버튼 Button1과 Button2를 배치하고, OnClick 이벤트에 해당 프로시저 호출 코드를 작성합니다. |
프로그램 소스 코드의 일부는 다음과 같습니다. |
Windows, 메시지, SysUtils, 클래스, 그래픽, 컨트롤, 양식, 대화 상자, StdCtrls, Zlib; |
절차 Button1Click(보내는 사람: TObject); |
절차 Button2Click(보내는 사람: TObject); |
절차 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; |
개수 := CompressedStream.Size; |
DestStream := TMemoryStream.Create; |
SourceStream:=TCompressionStream.Create |
//SourceStream은 원본 이미지 스트림을 저장합니다. |
CompressedStream.SaveToStream(SourceStream); |
//원본 이미지 스트림을 압축하고, 압축된 이미지 스트림은 DestStream에 저장됩니다. |
CompressedStream.WriteBuffer(수, SizeOf |
CompressedStream.CopyFrom(DestStream, 0); |
절차 UnCompressBitmap(const CompressedStream: TFileStream; var Bmp: TBitmap); |
소스스트림: TDecompressionStream; |
DestStream: TMemoryStream; |
//압축된 이미지 스트림에서 원본 이미지의 크기를 읽습니다. |
CompressedStream.ReadBuffer(Count, SizeOf(Count)); |
//이미지 크기에 따라 읽을 원본 이미지 스트림에 대한 메모리 블록을 할당합니다. |
DestStream := TMemoryStream.Create; |
SourceStream := TDecompressionStream.Create(CompressedStream); |
//압축된 이미지 스트림의 압축을 풀어 버퍼 메모리 블록에 저장합니다. |
SourceStream.ReadBuffer(버퍼^, 개수); |
//원본 이미지 스트림을 DestStream 스트림에 저장 |
DestStream.WriteBuffer(Buffer^, Count); |
DestStream.Position := 0;//스트림 포인터 재설정 |
//DestStream 스트림에서 원본 이미지 스트림을 로드합니다. |
Bmp.LoadFromStream(DestStream); |
절차 TForm1.Button1Click(Sender: TObject); |
CompressedStream := TMemoryStream.Create; |
//현재 화면 전체를 캡처하고 이미지를 Bmp 개체에 저장합니다. GetScreen(Bmp); |
//Bmp 객체의 이미지를 메모리 스트림에 저장합니다. |
//기본 압축 비율에 따라 원본 이미지 스트림을 압축합니다. |
CompressBitmap(CompressedStream, clDefault); |
//압축된 이미지 스트림을 사용자 정의 형식 파일로 저장 |
CompressedStream.SaveToFile(' C:cj.dat' ); |
절차 TForm1.Button2Click(Sender: TObject); |
//파일 스트림의 읽기 전용 모드에서 사용자 정의 압축 형식 파일을 엽니다. |
CompressedStream := TFileStream.Create(' C:cj.dat' , fmOpenRead); |
UnCompressBitmap(압축스트림, Bmp); |
//원본 이미지 스트림을 지정된 BMP 파일로 복원합니다. |
Bmp.SaveToFile(' C:cj.bmp' ); |
또한 TCompressionStream 객체는 원본 데이터를 압축한 후 압축 비율을 설명하는 데 사용되는 CompressionRate 속성도 제공합니다. 개발자는 압축 및 압축 해제 프로세스 중에 이 이벤트를 작성하여 진행률 코드를 표시할 수 있습니다. . |
위의 코드는 Delphi 5.0에서 디버깅 및 실행을 통과합니다. |