天天看點

Delphi下實作全屏快速找圖找色 四、BitmapData.pas的使用

四、BitmapData.pas的使用

(注:以上壓縮包中的BitmapData.pas檔案有個小BGU,主要是截取滑鼠指針的圖檔時沒有考慮目前的背景顔色,始終為黑色。在本貼三樓的壓縮包中有更新後的BitmapData.pas檔案下載下傳。)

  在上面的壓縮包中是BitmapData.pas使用的示範程式,BitmapData.pas檔案可以從壓縮包中獲得。在BitmapData.pas檔案中我将位圖資料封裝成了類TBDBitmapData,以便于使用。另外我編寫一系列的函數用以BGR格式顔色的建構、轉換、模糊比較。注意在BitmapData.pas檔案中我定義了一些常量,這些常量隻是為了增加程式的可讀性,修改這些常量不會修改程式支援資料的格式,隻會使程式運作錯誤。BitmapData.pas檔案的詳細說明如下:

1、function BGR(B,G,R : Byte): TBDColor;

  根據藍(B)、綠(G)、紅(R)三個通道的值生成一個BGR格式顔色。

2、function RGBtoBGR(C : TColor): TBDColor;

  将一個RGB顔色格式轉換到BGR顔色格式。

3、function BGRtoRGB(C : TBDColor): TColor;

  将一個BGR顔色格式轉換到RGB顔色格式。

4、function BDCompareColor(C1,C2 : TBDColor; const Range : TBDColorRange): Boolean;

  根據顔色範圍Range比較顔色C1和C2,傳回C1和C2是否相似。C1和C2是BGR格式的顔色,Range是顔色的變化範圍。

 TBDColorRange的定義如下:

  TBDColorRange = record

    R: Integer;

    G: Integer;

    B: Integer;

  end;

  其中,R表示C1和C2中紅色通道最大的相內插補點;G表示C1和C2中綠色通道最大的相內插補點;B表示C1和C2中藍色通道最大的相內插補點。

  示範程式,比較兩個顔色:

var 

    C1,C2 : TBDColor; 

    Range : TBDColorRange; 

begin 

    Range.R:=5; 

    Range.G:=5; 

    Range.B:=5;  

    C1:=BGR(125,125,125); 

    C2:=BGR(120,120,120); 

    BDCompareColor(C1,C2,Range); //成功  

    C1:=BGR(125,120,125); 

    C1:=BGR(125,200,125); 

    BDCompareColor(C1,C2,Range); //失敗 

end;

5、constructor TBDBitmapData.Create(const AName : String);

  建立一個TBDBitmapData對象的執行個體。可以為執行個體指定一個名字,便于以後的管理。

6、procedure TBDBitmapData.Clear;

  清除目前TBDBitmapData對象中加載的位圖資料。

7、function TBDBitmapData.LoadFromStream(Stream : TStream; ABackColor : TBDColor): Boolean;

  從資料流Stream中導入位圖資料,傳回是否成功。如果失敗将設定Error成員說明情況。資料流中的資料必需是24位BMP格式檔案資料。利用ABackColor可以設定圖檔的背景顔色,該參數可以省略,省略時表示圖檔不使用背景顔色。

8、function TBDBitmapData.SaveToStream(Stream : TStream):Boolean;

  将目前加載的位圖資料導出到資料流Stream中,傳回是否成功。如果失敗将設定Error成員說明情況。資料将按24位BMP檔案資料格式導出到資料流中。

9、function TBDBitmapData.LoadFromFile(const FileName : string; ABackColor : TBDColor): Boolean;

  從檔案FileName中導入位圖資料,傳回是否成功。如果失敗将設定Error成員說明情況。檔案必需是24位BMP格式檔案。利用ABackColor可以設定圖檔的背景顔色,該參數可以省略,省略時表示圖檔不使用背景顔色。

10、function TBDBitmapData.SaveToFile(const FileName : string): Boolean;

  将目前加載的位圖資料導出到檔案中,傳回是否成功。如果失敗将設定Error成員說明情況。資料按24位BMP檔案資料格式導出到檔案中。

11、function TBDBitmapData.LoadFromBitmap(Bitmap : TBitmap): Boolean;

  從一個TBitmap對象中導入資料,傳回是否成功。如果失敗将設定Error成員說明情況。導入時圖檔的背景顔色由Bitmap.Transparent和Bitmap.TransparentColor決定。

12、function TBDBitmapData.SaveToBitmap(Bitmap : TBitmap): Boolean;

  将目前的位圖資料導出到一個TBitmap對象中,傳回是否成功。如果失敗将設定Error成員說明情況。導出時将根據目前的背景顔色設定Bitmap.Transparent和Bitmap.TransparentColor成員。利用LoadFromBitmap和SaveToBitmap兩個函數可以實作TBDBitmapData對象和TBitmap對象的互相轉換。

13、function TBDBitmapData.CopyFormScreen(Left,Top,AWidth,AHeight : Integer): Boolean;

  從螢幕上的指定範圍中截圖,并導入資料,傳回是否成功。如果失敗将設定Error成員說明情況。Left為截圖的左邊距,可省略,預設為0;Top為截圖的頂邊距,可省略,預設為0;AWidth為截圖的寬度,可省略,預設為從Left到螢幕右邊的寬度;AHeight為截圖的高度,可省略,預設為從Top到螢幕底邊的高度。

14、function TBDBitmapData.CopyFormCursor: Boolean;

  截取滑鼠目前指針的圖檔,并導入資料,傳回是否成功。如果失敗将設定Error成員說明情況。如果滑鼠指針是動畫指針,預設截取第一幀畫面。截取時會使用目前背景顔色填充背景,如果沒有指定背景顔色則使用白色(RGB(255,255,255))填充。

15、function TBDBitmapData.Compare(Bmp : TBDBitmapData; Left,Top : Integer): Boolean;

16、function TBDBitmapData.Compare(Bmp : TBDBitmapData; const Range : TBDColorRange; Left,Top : Integer): Boolean;

  重載的兩個函數,用于在目前位圖的指定位置比較Bmp指定的位圖,傳回是否一緻。無論比較是否一緻都不會修改Error成員。第一個函數用于精确比較,第二個函數用于模糊比較。Bmp指定的位圖面幅要小于等于目前位圖的面幅,Bmp指定的位圖不能超出目前位圖,否則比較失敗。Bmp為指定的位圖資料;Left為比較時的左邊距,可省略,預設為0;Top為比較時的頂邊距,可省略,預設為0;Range為顔色變化範圍。

17、function TBDBitmapData.FindImage(Bmp : TBDBitmapData; var Left,Top : Integer): Boolean;

18、function TBDBitmapData.FindImage(Bmp : TBDBitmapData; const Range : TBDColorRange; var Left,Top : Integer): Boolean;

  重載的兩個函數,從目前位圖中查找與Bmp一緻的子圖,傳回是否找到。無論是否找到都不會修改Error成員。第一個函數用于精确比較,第二個函數用于模糊比較。查找時忽略Left和Top的設定,從目前位圖的左上角開始按從左到右,從上到下的順序查找。找到傳回true,設定Left和Top為找到子圖的位置;沒找到傳回false,設定Left和Top為-1。Bmp為指定的子圖資料;Left為找到子圖的左邊距;Top為找到子圖的頂邊距;Range為顔色變化範圍。

  示範程式,在螢幕上查找子圖:

    Bit1,Bit2 : TBDBitmapData; 

    Left,Top : Integer; 

    Bit1:=TBDBitmapData.Create; 

    Bit2:=TBDBitmapData.Create; 

    Bit1.CopyFormScreen; 

    Bit2.LoadFromFile('檔案名'); 

    if Bit1.FindImage(Bit2,Left,Top) then 

    begin 

        {已找到子圖,進行相應的處理...} 

    end; 

    Bit1.Free; 

    Bit2.Free; 

19、function TBDBitmapData.FindCenterImage(Bmp : TBDBitmapData; var Left,Top : Integer): Boolean;

20、function TBDBitmapData.FindCenterImage(Bmp : TBDBitmapData; const Range : TBDColorRange; var Left,Top : Integer): Boolean;

  重載的兩個函數,從目前位圖中查找與Bmp一緻的子圖,傳回是否找到。無論是否找到都不會修改Error成員。第一個函數用于精确比較,第二個函數用于模糊比較。查找時以Left和Top的設定為基點,從中心向四周查找。找到傳回true,設定Left和Top為找到子圖的位置;沒找到傳回false,設定Left和Top為-1。Bmp為指定的子圖資料;Left為找到子圖的左邊距;Top為找到子圖的頂邊距;Range為顔色變化範圍。

21、function TBDBitmapData.EnumImage(Bmp : TBDBitmapData; EnumImageProc : TBDEnumImageProc; lParam : Integer): Boolean;

22、function TBDBitmapData.EnumImage(Bmp : TBDBitmapData; const Range : TBDColorRange; EnumImageProc : TBDEnumImageProc; lParam : Integer): Boolean;

  重載的兩個函數,從目前位圖中查找所有與Bmp一緻的子圖,即枚舉位圖,傳回是否找到。無論是否找到都不會修改Error成員。第一個函數用于精确比較,第二個函數用于模糊比較。查找時從目前位圖的左上角開始按從左到右,從上到下的順序查找。每當查找到一個子圖,就調用回調函數EnumImageProc,如果EnumImageProc傳回false就停止查找,結束函數。Bmp為子圖資料;EnumImageProc為回調函數;lParam為調用回調函數時發出的參數,可省略,預設為0;Range為顔色變化範圍。TBDEnumImageProc的聲明格式如下:

TBDEnumImageProc = function (Left,Top : Integer; Bmp : TBDBitmapData; lParam : Integer): Boolean;

  其中,Left為找到子圖的左邊距;Top為找到子圖的頂邊距;Bmp為調用EnumImage時給出的查找子圖資料;lParam為調用EnumImage時給出的設定參數。該函數的傳回值表示是否繼續枚舉。

23、function TBDBitmapData.FindColor(Color : TBDColor; var Left,Top : Integer): Boolean;

24、function TBDBitmapData.FindColor(Color : TBDColor; const Range : TBDColorRange; var Left,Top :Integer): Boolean;

  重載的兩個函數,從目前位圖中查找指定的顔色,忽略目前位圖背景顔色BackColor的設定,傳回是否找到。無論是否找到都不會修改Error成員。第一個函數用于精确比較,第二個函數用于模糊比較。查找時忽略Left和Top的設定,從目前位圖的左上角開始按從左到右,從上到下的順序查找。找到傳回true,設定Left和Top為找到顔色的位置,沒找到傳回false,設定Left和Top為-1。Color為BGR格式顔色;Left為找到顔色的左邊距;Top為找到顔色的頂邊距;Range為顔色變化範圍。

25、function TBDBitmapData.FindCenterColor(Color : TBDColor; var Left,Top : Integer): Boolean;

26、function TBDBitmapData.FindCenterColor(Color : TBDColor; const Range : TBDColorRange; var Left,Top : Integer): Boolean;

  重載的兩個函數,從目前位圖中查找指定的顔色,忽略目前位圖背景顔色BackColor的設定,傳回是否找到。無論是否找到都不會修改Error成員。第一個函數用于精确比較,第二個函數用于模糊比較。查找時以Left和Top的設定為基點,從中心向四周查找。找到傳回true,設定Left和Top為找到顔色的位置,沒找到傳回false,設定Left和Top為-1。Color為BGR格式顔色;Left為找到顔色的左邊距;Top為找到顔色的頂邊距;Range為顔色變化範圍。

  示範程式,在螢幕上以某點為中心向四周模糊查找顔色:

    Bit : TBDBitmapData; 

    Bit:=TBDBitmapData.Create; 

    Bit.CopyFormScreen; 

    Range.B:=5; 

    Left:=600; 

    Top:=380; 

    if Bit.FindCenterColor(BGR(0,250,250),Range,Left,Top) then 

        {已找到顔色,進行相應的處理...} 

    Bit.Free; 

27、function TBDBitmapData.EnumColor(Color : TBDColor; EnumColorProc : TBDEnumColorProc; lParam : Integer): Boolean;

28、function TBDBitmapData.EnumColor(Color : TBDColor; const Range : TBDColorRange; EnumColorProc : TBDEnumColorProc; lParam : Integer): Boolean;

  重載的兩個函數,從目前圖檔中查找所有指定的顔色,即枚舉顔色,忽略目前位圖背景顔色BackColor的設定,傳回是否找到。無論是否找到都不會修改Error成員。第一個函數用于精确比較,第二個函數用于模糊比較。查找時從目前位圖的左上角開始按從左到右,從上到下的順序查找。每找到一個顔色,就調用回調函數EnumColorProc,如果EnumColorProc傳回false就停止查找,結束函數。Color為BGR格式顔色;EnumColorProc為回調函數;lParam為調用回調函數時發出的參數,可省略,預設為0;Range為顔色變化範圍。TBDEnumColorProc的聲明格式如下:

TBDEnumColorProc = function (Left,Top : Integer; Color : TBDColor; lParam : Integer): Boolean;

  其中,Left為找到顔色的左邊距;Top為找到顔色的頂邊距;Color為找到的顔色,當使用模糊查找時該顔色為實際找到的顔色;lParam為調用EnumColor時給出的設定參數。該函數的傳回值表示是否繼續枚舉。

29、TBDBitmapData.Error

  最近一次操作出現的錯誤的說明。出于性能方面的考慮,隻有導入、導出、截圖等操作才會修改這個成員。而查找、枚舉等操作無論是否成功都不會修改這個成員。

30、TBDBitmapData.Name

  目前位圖的名稱,可讀寫。友善位圖資料的管理。

31、TBDBitmapData.Width

  目前位圖寬度,以象素為機關,隻讀。

32、TBDBitmapData.Height

  目前位圖高度,以象素為機關,隻讀。

33、TBDBitmapData.BackColor

  目前位圖的背景顔色,BGR格式的顔色,可讀寫。當該顔色為BD_COLORLESS時,表示該位圖不使用背景顔色。

34、TBDBitmapData.LineWidth

  對齊後每行位圖資料的寬度,以位元組為機關,隻讀。

35、TBDBitmapData.SpareWidth

  對齊後每行位圖資料填充的多餘寬度,以位元組為機關,隻讀。

36、TBDBitmapData.Size

  位圖資料的長度,以位元組為機關,隻讀。

37、TBDBitmapData.Bits

  位圖資料緩沖區指針,隻讀。這個指針是隻讀的,但它指向的資料是可讀寫的。可以将這個屬性看成是一個一維的位元組數組,可以對緩沖區中的資料進行通路和修改。