要如何把兩個 Bitmap 做 Xor 運算找出相異的點? |
尚未結案
|
雪豆豆
一般會員 發表:19 回覆:22 積分:13 註冊:2002-08-18 發送簡訊給我 |
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
這是我寫的一個比對BMP圖片的程式,採用記憶體比對的方式,速度是快很多,
但有一個地方
off:=54+3*34; // 這理還有問題,不同的圖片,檔頭大小好像會不一樣
有些圖片為54,有些為54+3*34,現在還不太清楚,
知道原理的網友幫個忙看一下,謝謝!
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls; type TForm1 = class(TForm) Image1: TImage; Image2: TImage; BitBtn1: TBitBtn; BitBtn2: TBitBtn; procedure BitBtn1Click(Sender: TObject); procedure BitBtn2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} // 用記憶體的比對法 procedure TForm1.BitBtn1Click(Sender: TObject); var t1,t2:ttime; TempStream : TMemoryStream; tempstream2: TMemoryStream; wid,hei:integer; i,j,k,k2,y1,y2,x1,x2:integer; P,p2 : PByteArray; allsame:boolean; r:trect; off:integer; label sk1,sk2; begin t1:=now; TempStream := TMemoryStream.Create; // Image1記憶體存放用 TempStream2 := TMemoryStream.Create;// Image2記憶體存放用 wid:=image1.width; hei:=image1.height; image1.picture.Graphic.SaveToStream(TempStream); // 將Image1寫入記憶體 image2.picture.Graphic.SaveToStream(TempStream2); // 將Image2寫入記憶體 p:=tempstream.Memory; // 用p指標指向這塊記憶體 p2:=tempstream2.Memory;// 用p2指標指向第二塊記憶體 off:=54 3*34; // 這理還有問題,不同的圖片,檔頭大小好像會不一樣 k:=off; if tempstream.size<>tempstream2.size then // 兩個圖大小不同無法比 begin allsame:=False; y1:=0; y2:=hei-1; x1:=0; x2:=wid-1; end else begin allsame:=true; y1:=0; y2:=hei-1; k:=off; // 先比對Y由下而上 for j:=hei-1 downto 0 do begin if not comparemem(@p[k],@p2[k],wid*3) then begin y2:=j; allsame:=False; break; end; k:=k wid*3; end; k:=off (hei-1)*wid*3; // 比對Y由上而下 for j:=0 to y2 do begin if not comparemem(@p[k],@p2[k],wid*3) then begin y1:=j; allsame:=False; break; end; k:=k-wid*3; end; k2:=off (hei-y1)*wid*3; // 比對X由左而右 x1:=0; x2:=wid-1; for i:=0 to wid-1 do begin k:=k2; for j:=y1 to y2 do begin if (p[k]<>p2[k]) or (p[k 1]<>p2[k 1]) or (p[k 2]<>p2[k 2]) then begin x1:=i; allsame:=False; goto sk1; end; k:=k-wid*3; end; k2:=k2 3; end; sk1:; k2:=off (hei-y1)*wid*3 (wid-1)*3; // 比對X由右而左 for i:=wid-1 downto x1 do begin k:=k2; for j:=y1 to y2 do begin if (p[k]<>p2[k]) or (p[k 1]<>p2[k 1]) or (p[k 2]<>p2[k 2]) then begin x2:=i; allsame:=False; goto sk2; end; k:=k-wid*3; end; k2:=k2-3; end; sk2:; end; if allsame then showmessage('Same Picture') else begin // 將找的不同的區域x1,y1-x2,y2畫一個框框標示 image1.Canvas.MoveTo(x1,y1); image1.Canvas.LineTo(x1,y2); image1.Canvas.LineTo(x2,y2); image1.Canvas.LineTo(x2,y1); image1.Canvas.LineTo(x1,y1); image2.Canvas.MoveTo(x1,y1); image2.Canvas.LineTo(x1,y2); image2.Canvas.LineTo(x2,y2); image2.Canvas.LineTo(x2,y1); image2.Canvas.LineTo(x1,y1); end; TempStream.Free; TempStream2.Free; t2:=now-t1; caption:=format('%.15f',[t2]); // 印出計算所費時間 end; // 用一個點一個點的比對法 procedure TForm1.BitBtn2Click(Sender: TObject); var t1,t2:ttime; x,y:integer; wid,hei:integer; begin t1:=now; wid:=image1.width; hei:=image1.height; for x:=0 to wid-1 do for y:=0 to height-1 do begin if image1.Canvas.Pixels[x,y]<>image2.Canvas.Pixels[x,y] then image2.Canvas.Pixels[x,y]:=$FFFFFF; end; t2:=now-t1; caption:=format('%.15f',[t2]); end; end.~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~ |
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
引言: off:=54 3*34; // 這理還有問題,不同的圖片,檔頭大小好像會不一樣 直接用這個offset可能不太可靠, DIB,DDB不同, 是否有colorMap也不一定, 甚至color plan不同也會影響, 大概還是必須仔細分析head 之Structure請問何謂DIB?何謂DDB? 好像常看到這個名詞? 還有我的範例程式是假設所用的調色盤為True Color 24 Bit的! ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~ |
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
引言: DIB: Device Independet Bitmap DDB: Device Dependent Bitmap,檔頭不含color map資訊, 故在不同機器上若color Map不同, 會顯示不同顏色 Delphi Default為DIB 另high color或True Color之Bitmap每一pixel直接存RGB value無color map故offset位置也會不同謝謝您,我知道了,會再找資料來看看! ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |