Delphi資料壓縮處理(1) (轉)
Delphi資料壓縮處理(1) (轉)[@more@]
Borland公司推出的 RAD開發工具 Delphi 5.0作為 平臺上的主流開發工具,其視覺化的開發環境和麵向的強大功能已經吸引了無數的開發人員。但是,一些員在實際的開發過程中卻時常為對大量的資料進行壓縮而傷透腦筋,不得不去查詢一些高效的壓縮演算法或在網上查詢第三方的來實現壓縮。難道 Delphi本身沒有提供這個功能嗎?其實 Delphi的師早就考慮到了這一點,他們提供了 .pas和 Zlibconst.pas兩個單元來解決資料壓縮問題,實現了很高的資料壓縮比率。這兩個檔案儲存在 Delphi 5.0光碟上 InfoExtrasZlib目錄下,此外,在 InfoExtrasZlibObj目錄中還儲存了 Zlib.pas單元引用的 Obj檔案。下面本文以壓縮一個螢幕複製為例介紹如何使用這項功能。
解決思路
首先利用螢幕複製捕捉到當前整個螢幕的影像,然後在中儲存為 BMP檔案格式。壓縮時,使用 TCompressionStream物件對原始影像進行壓縮並且儲存為自定義的檔案格式;解壓縮時,使用 TDecompressionStream物件對被壓縮的影像進行解壓縮,還原為 BMP格式的影像檔案。
具體實現
新建一個專案檔案,在主單元的介面部分引用 Zlib.pas,在主表單上放置兩個按鈕 Button1、 Button2,在它們的 OnClick事件中寫上相應的過程程式碼。
部分程式如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, Zlib;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: T);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$ R* .DFM}
1.捕捉全螢幕影像
procedure GetScreen(var Bmp: TBitmap);
var
Dc: HDC;
MyCanvas: TCanvas;
MyRect: TRect;
begin
Dc := GetWindowDC(0);
MyCanvas := TCanvas.Create;
try
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);
finally
MyCanvas.Handle := 0;
MyCanvas.Free;
ReleaseDC(0, Dc);
end;
end;
2.壓縮影像
procedure CompressBitmap(var CompressedStream: TMemoryStream;const CompressionLevel: TCompressionLevel);
var
Stream: TCompressionStream;
DestStream: TMemoryStream;
Count: Integer;
Begin
file://獲得影像流的原始尺寸
Count := CompressedStream.Size;
DestStream := TMemoryStream.Create;
SourceStream:=TCompressionStream.Create
(CompressionLevel, DestStream);
Try
file://SourceStream中儲存著原始的影像流
CompressedStream.SaveToStream(SourceStream);
file://將原始影像流進行壓縮, DestStream中儲存著壓縮後的影像流
SourceStream.Free;
CompressedStream.Clear;
file://寫入原始影像的尺寸
CompressedStream.WriteBuffer(Count, SizeOf
(Count));
file://寫入經過壓縮的影像流
CompressedStream.CopyFrom(DestStream, 0);
finally
DestStream.Free;
end;
end;
3.還原被壓縮影像
procedure UnCompressBitmap(const CompressedStream: TFileStream; var Bmp: TBitmap);
var
SourceStream: TDecompressionStream;
DestStream: TMemoryStream;
資料處理(1)
Borland公司推出的 RAD開發工具 Delphi 5.0作為 平臺上的主流開發工具,其視覺化的開發環境和麵向的強大功能已經吸引了無數的開發人員。但是,一些員在實際的開發過程中卻時常為對大量的資料進行壓縮而傷透腦筋,不得不去查詢一些高效的壓縮演算法或在網上查詢第三方的來實現壓縮。難道 Delphi本身沒有提供這個功能嗎?其實 Delphi的師早就考慮到了這一點,他們提供了 .pas和 Zlibconst.pas兩個單元來解決資料壓縮問題,實現了很高的資料壓縮比率。這兩個檔案儲存在 Delphi 5.0光碟上 InfoExtrasZlib目錄下,此外,在 InfoExtrasZlibObj目錄中還儲存了 Zlib.pas單元引用的 Obj檔案。下面本文以壓縮一個螢幕複製為例介紹如何使用這項功能。
解決思路
首先利用螢幕複製捕捉到當前整個螢幕的影像,然後在中儲存為 BMP檔案格式。壓縮時,使用 TCompressionStream物件對原始影像進行壓縮並且儲存為自定義的檔案格式;解壓縮時,使用 TDecompressionStream物件對被壓縮的影像進行解壓縮,還原為 BMP格式的影像檔案。
具體實現
新建一個專案檔案,在主單元的介面部分引用 Zlib.pas,在主表單上放置兩個按鈕 Button1、 Button2,在它們的 OnClick事件中寫上相應的過程程式碼。
部分程式如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, Zlib;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: T);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$ R* .DFM}
1.捕捉全螢幕影像
procedure GetScreen(var Bmp: TBitmap);
var
Dc: HDC;
MyCanvas: TCanvas;
MyRect: TRect;
begin
Dc := GetWindowDC(0);
MyCanvas := TCanvas.Create;
try
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);
finally
MyCanvas.Handle := 0;
MyCanvas.Free;
ReleaseDC(0, Dc);
end;
end;
2.壓縮影像
procedure CompressBitmap(var CompressedStream: TMemoryStream;const CompressionLevel: TCompressionLevel);
var
Stream: TCompressionStream;
DestStream: TMemoryStream;
Count: Integer;
Begin
file://獲得影像流的原始尺寸
Count := CompressedStream.Size;
DestStream := TMemoryStream.Create;
SourceStream:=TCompressionStream.Create
(CompressionLevel, DestStream);
Try
file://SourceStream中儲存著原始的影像流
CompressedStream.SaveToStream(SourceStream);
file://將原始影像流進行壓縮, DestStream中儲存著壓縮後的影像流
SourceStream.Free;
CompressedStream.Clear;
file://寫入原始影像的尺寸
CompressedStream.WriteBuffer(Count, SizeOf
(Count));
file://寫入經過壓縮的影像流
CompressedStream.CopyFrom(DestStream, 0);
finally
DestStream.Free;
end;
end;
3.還原被壓縮影像
procedure UnCompressBitmap(const CompressedStream: TFileStream; var Bmp: TBitmap);
var
SourceStream: TDecompressionStream;
DestStream: TMemoryStream;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990234/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Delphi資料壓縮處理(2) (轉)
- 批處理壓縮
- Delphi處理JSON格式資料JSON
- ffmpeg-圖片壓縮旋轉等處理
- 資料壓縮簡史 (轉)
- Gulp壓縮報錯處理
- zip壓縮檔案處理方案(Zip4j壓縮和解壓)
- java中 檔案壓縮處理Java
- VB環境下壓縮資料流播放技術(1) (轉)
- .Net Core HttpClient處理響應壓縮HTTPclient
- Oracle資料壓縮Oracle
- web前端實現圖片壓縮處理Web前端
- Oracle壓縮黑科技(二)—壓縮資料的修改Oracle
- Teradata資料壓縮
- 海量資料處理 (轉)
- 解決了幾乎所有Delphi+Access同仁的問題—動態建立、壓縮Access資料庫(*.MDB) (轉)資料庫
- 一次性將多個資料夾批處理壓縮成多個.rar
- 批處理 壓縮zip 並過濾部分檔案
- 在Delphi中處理資料庫日期型欄位的顯示與輸入 (轉)資料庫
- 資料處理及跳轉
- 用Delphi處理公曆到農曆的轉換 (轉)
- linux壓縮(解壓縮)命令詳解-轉Linux
- 利用Java實現zip壓縮/解壓縮 (轉)Java
- Linux下壓縮,解壓縮RAR包(轉)Linux
- 解包 bzip2 壓縮的壓縮文件(轉)
- linux 下壓縮與解壓資料夾Linux
- Java實現壓縮資料夾Java
- 資料庫壓縮技術探索資料庫
- 利用 canvas 實現資料壓縮Canvas
- FreeBSD資料處理方式(轉)
- 機器學習導圖系列(1):資料處理機器學習
- 怎麼把資料夾壓縮成壓縮包發給微信好友
- 11g 資料庫rman壓縮備份壓縮率測試資料庫
- Delphi處理TWebBrowser的Close事件Web事件
- IBM收購實時資料壓縮廠商Storwize(轉)IBM
- VB環境下壓縮資料流播放技術(2) (轉)
- POJ 2443Set Operation(好題! 每32位壓縮處理)
- 【scikit-learn基礎】--『預處理』之 資料縮放