이 클래스에 대한 설명입니다
1, 기본 클래스인 tcustomzlibstream: classtcustomzlibstream 은 TCompressionStream 및 TDecompressionStream 클래스의 기본 클래스이며, 주로 oom 이라는 속성을 가집니다 다음과 같이 정의됩니다.
Procedure OnProgress (보낸 사람: to object); 동적;
2. 압축 클래스 tccompressionstream: tccompressionstream 클래스는 기본 클래스의 OnProgress 속성을 상속하는 것 외에 다음과 같이 정의된 CompressionRate 라는 또 다른 속성을 추가합니다.
Property CompressionRate: GetCompressionRate 를 한 번에 읽으면 압축비를 얻을 수 있습니다.
몇 가지 중요한 방법은 다음과 같이 정의됩니다.
생성자 TCompressionStream. Create (compression level: tcompressionlevel; Dest: t stream);
여기서 TcompressionLevel (압축 유형) 은 다음에 의해 정의됩니다.
(1) clNone: 데이터 압축 없음 :
(2) clf.a.s.t.: 압축 효율을 희생하는 빠른 압축
③ cl 기본값: 정상 압축;
(4) clMax: 압축 최대화, 속도 희생;
Dest: 압축된 데이터를 저장하는 대상 스트림입니다.
함수 TCompressionStream. 쓰기 (const buffer count: longint): longint;
여기서: Buffer: 압축할 데이터
개수: 압축할 데이터의 바이트 수입니다.
함수는 스트림에 기록된 바이트 수를 반환합니다.
압축 클래스 TCompressionStream 의 데이터만 쓸 수 있습니다. 데이터를 읽으려고 하면 "오류" 예외가 발생합니다. 압축할 데이터는 Write 메소드를 통해 스트림에 기록되고, 쓰기 중 압축되고, 생성자가 제공하는 TmemoryStream 에 저장되고, OnProcess 이벤트가 트리거됩니다.
3. 추출 클래스 TDecompressionStream: 압축 클래스 TcompressionStream 과는 달리 해당 데이터는 읽기 전용입니다. 데이터를 쓰려고 하면 "오류" 예외가 발생합니다. 몇 가지 중요한 방법은 다음과 같이 정의됩니다.
생성자 create (출처: tstream);
여기서 Source 는 압축된 데이터를 저장하는 스트림입니다.
함수 읽기 (var 버퍼; Count: longint): longint;
데이터 읽기 기능, 버퍼: 데이터 저장소 버퍼;
Count: 버퍼 크기;
함수는 읽은 바이트 수를 반환합니다.
데이터를 읽는 동안 데이터 압축이 해제되고 OnProcess 이벤트가 트리거됩니다.
둘째, 반의 사용
TCompressionStream 과 TdecompressionStream 을 함께 사용하면 데이터를 쉽게 압축하고 압축을 풀 수 있습니다. 다음은 화면 복사 프로그램을 작성할 때 사용한 예입니다.
프로시저 TClientForm. GetScreen
변수를 정의합니다
SourceDC, destdc: hdc;
B handle: hbitmap;
비트맵: TBitMap
BmpStream, dest stream:TMemoryStream;;
Sourcestream: tcompressionstream;
개수: 정수
시작
SourceDC:=CreateDC('display',',',', nil);
{화면에 대한 DC 가져오기}
Destdc: = createcompatibledc (sourcedc);
{임시 DC 생성}
Bhandle: = createcompatiblebitmap (sourcedc, Screen). 너비, 화면. 키);
{비트맵 만들기}
SelectObject(DestDC, b handle);
{비트맵 DC 선택}
BitBlt(DestDC, 0, 0, Screen. 너비, 화면. Height, SourceDC, 0,0, srccopy) :
{전체 화면 복사}
비트맵: =TBitMap 입니다. 만들기;
비트맵. Handle:= Bhandle;;
{화면 비트맵을 비트맵으로 저장}
BmpStream:=TMemoryStream 입니다. 만들기;
비트맵. SaveToStream(BMP stream););
{비트맵 데이터의 메모리 스트림 만들기}
개수: =BmpStream. 크기;
{저장된 비트맵의 크기}
DestStream:=TMemoryStream 입니다. 만들기;
{대상 스트림, 압축된 데이터 저장}
Sourcestream: = tcompressionstream 입니다. Create(clMax, dest stream);
{압축 스트림 설정, 최대 압축, 대상 스트림에 저장}
시도하다
Bmp 스트림. SaveToStream (소스);
{압축된 비트맵 스트림}
원류. 무료;
{압축 완료 및 압축 흐름 해제}
Bmp 스트림. 명료하다
{원본 비트맵 스트림 비우기}
Bmp 스트림. WriteBuffer (수, Sizeof (수));
{원본 비트맵 크기를 사용할 새 비트맵 스트림에 저장}
Bmp 스트림. CopyFrom(DestStream, 0);
{압축된 데이터를 새 비트맵 스트림에 추가}
Bmp 스트림. 위치: = 0;
NMStrm. 포스트잇 (BMP 스트림);
{비트맵 스트림 보내기}
마지막으로
DestStream. 무료;
Bmp 스트림. 파괴;
비트맵. 파괴;
Deletedc (sourcedc) :
ReleaseDC(Bhandle, sourcedc) :
끝;
{관련 리소스 게시}
끝;
이 과정에서 전체 화면의 이미지 복사본을 가져와 압축 스트림 SourceStream 과 메모리 스트림 Deststream 을 사용하여 비트맵을 압축하고 비트맵 크기와 압축 데이터 스트림을 비트맵 스트림에 다시 저장하여 보냅니다. 비트맵 크기를 보내는 목적은 압축을 풀기 전에 필요한 메모리 공간을 결정하는 것입니다.
프로세스 TServerForm. NMStrmServMSG (보낸 사람: TComponent
Const SF from:String;; Strm: t stream);
변수를 정의합니다
StreamStr, deststream: tmemorystream;
Sourcestream: tdecompressionstream;
개수: 정수
버퍼: 포인터;
시작
화면 이미지. 그림. 비트맵: = nil
Strm 이 TMemoryStream 이면
StreamStr := Strm AS TMemoryStream
기타
종료;
StreamStr. 위치: = 0;
StreamStr. ReadBuffer(Count, Sizeof(Count)););
{비트맵 크기 가져오기}
GetMem (버퍼, 개수);
{요청 데이터 공간}
DestStream := TMemoryStream. 만들기;
Sourcestream: = tdecompressionstream. Create (streamstr);
{StreamStr 스트림에서 추출된 데이터를 가져오는 압축 해제 스트림 구축}
상태 표시줄. SimpleText :=' 이미지 처리 중';
시도하다
원류. Readbuffer(buffer^,count); count);
{압축 해제된 데이터 읽기}
DestStream. Writebuffer(buffer^,count); count);
{비트맵 스트림에 저장}
DestStream. 위치: = 0;
화면 이미지. Picture.bitmap.loadfromstream (deststream);
{화면에 표시}
마지막으로
FreeMem (버퍼);
DestStream. 파괴;
원류. 파괴;
끝;
끝;
이 절차에서는 가져온 데이터 스트림에서 비트맵 크기를 가져오고 메모리 공간을 적용한 다음 압축 해제 스트림을 설정하고 압축 해제된 데이터를 비트맵 스트림에 저장한 다음 화면에 표시합니다.
이 프로그램은 델파이 6.0 에서 디버깅에 성공했습니다.