델파이 데이터 압축 처리(1)
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 이벤트에 해당 프로시저 호출 코드를 작성합니다.
프로그램 소스 코드의 일부는 다음과 같습니다.
단위 Unit1;
인터페이스
용도
Windows, 메시지, SysUtils, 클래스, 그래픽, 컨트롤, 양식, 대화 상자, StdCtrls, Zlib;
유형
TForm1 = 클래스(TForm)
버튼1: T버튼;
Button2: T버튼;
절차 Button1Click(보내는 사람: TObject);
절차 Button2Click(보내는 사람: TObject);
사적인
{비공개 선언}
공공의
{공개 선언}
끝;
var
Form1: TForm1;
구현
{$ R* .DFM}
1. 전체 화면 이미지 캡처
절차 GetScreen(var Bmp: TBitmap);
var
DC: HDC;
마이캔버스: 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;
file://전체 화면 이미지 캡처
Bmp.Canvas.CopyRect(MyRect, MyCanvas, MyRect);
마지막으로
MyCanvas.Handle := 0;
MyCanvas.Free;
릴리즈DC(0, Dc);
끝;
끝;
2. 이미지 압축
절차 CompressBitmap(var CompressedStream: TMemoryStream;const CompressionLevel: TCompressionLevel);
var
소스스트림: TCompressionStream;
DestStream: TMemoryStream;
개수: 정수;
시작하다
file://이미지 스트림의 원래 크기를 가져옵니다.
개수 := CompressedStream.Size;
DestStream := TMemoryStream.Create;
SourceStream:=TCompressionStream.Create
(압축 레벨, DestStream);
노력하다
원본 이미지 스트림은 file://SourceStream에 저장됩니다.
CompressedStream.SaveToStream(SourceStream);
file://원본 이미지 스트림을 압축하고, 압축된 이미지 스트림은 DestStream에 저장됩니다.
소스스트림.프리;
CompressedStream.Clear;
file://원본 이미지의 크기를 씁니다.
CompressedStream.WriteBuffer(수, SizeOf
(세다));
file://압축된 이미지 스트림 쓰기
CompressedStream.CopyFrom(DestStream, 0);
마지막으로
DestStream.Free;
끝;
끝;
3. 압축된 이미지 복원
절차 UnCompressBitmap(const CompressedStream: TFileStream; var Bmp: TBitmap);
var
소스스트림: TDecompressionStream;
DestStream: TMemoryStream;