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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ffmpeg-圖片壓縮旋轉等處理
- Gulp壓縮報錯處理
- zip壓縮檔案處理方案(Zip4j壓縮和解壓)
- java中 檔案壓縮處理Java
- SpringBoot-檔案壓縮處理Spring Boot
- .Net Core HttpClient處理響應壓縮HTTPclient
- 資料處理及跳轉
- SpringMVC:資料處理及跳轉SpringMVC
- 批處理 壓縮zip 並過濾部分檔案
- 有手就會的 Java 處理壓縮檔案Java
- 0910 – iPaste 搞定資料壓縮AST
- linux 下壓縮與解壓資料夾Linux
- OpenGL ES 壓縮紋理
- c語言,批次處理檔案,進行gzip壓縮C語言
- 壓縮錶轉非壓縮表(線上重定義)
- Java實現壓縮資料夾Java
- Hadoop(十九)MapReduce OutputFormat 資料壓縮HadoopORM
- 壓縮資料以節省空間和提高速度(轉)
- 【scikit-learn基礎】--『預處理』之 資料縮放
- Python資料處理(二):處理 Excel 資料PythonExcel
- 怎麼把資料夾壓縮成壓縮包發給微信好友
- 【轉載】Rocksdb壓縮詳解
- openGauss 支援OLTP場景資料壓縮
- Linux加密壓縮檔案/資料夾Linux加密
- Windows的壓縮資料夾(zip/cab)Windows
- 序列化資料傳輸壓縮
- 玩轉大資料系列之二:資料分析與處理大資料
- Nginx網路壓縮 CSS壓縮 圖片壓縮 JSON壓縮NginxCSSJSON
- LangChain轉換鏈:讓資料處理更精準LangChain
- 資料處理
- java 壓縮(解壓)檔案或者資料夾工具類Java
- 深度學習助力資料壓縮,一文讀懂相關理論深度學習
- 從Delphi到Lazarus——Delphi轉換器
- Android 圖片處理之固定視框中的等比例壓縮Android
- 小技巧:不用任何媒體處理軟體進行視訊壓縮
- 直播原始碼網站,js處理圖片變形、方向、壓縮等原始碼網站JS
- 移動開發時批處理壓縮圖片提高開發效率移動開發
- 使用Java API進行tar.gz檔案及資料夾壓縮解壓縮JavaAPI
- 高效的資料壓縮編碼方式 Protobuf