현재 위치 - 대출자문플랫폼 - 외환 플랫폼 - 델파이 압축 흐름 및 압축 해제 흐름 응용 프로그램

델파이 압축 흐름 및 압축 해제 흐름 응용 프로그램

소프트웨어 개발자는 데이터 압축 문제가 발생할 수밖에 없습니다! Delphi 를 자주 사용하는 친구들은 데이터 압축 및 압축 해제를 위한 두 가지 stream 클래스 (TCompressionStream 및 TDecompressionStream) 를 제공한다는 것을 알고 있지만 Delphi 의 도움으로 streams 에 대한 자세한 설명이 없다는 것이 미흡하다. 사실 이 두 클래스의 소스 코드와 라이브러리는 델파이 시스템에서 제공됩니다. Delphi CD 의 InfoExtraslib Src 및 InfoExtraslibObj 디렉토리에 보관됩니다. 여기서 재고는 Obj 디렉토리에 있고 소스 코드는 Src 디렉토리에 있으며 관심 있는 친구들은 볼 수 있습니다. 나는 사용 과정에서 그것들을 어느 정도 이해했다.

이 클래스에 대한 설명입니다

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 에서 디버깅에 성공했습니다.

copyright 2024대출자문플랫폼