全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2561
推到 Plurk!
推到 Facebook!

要如何把兩個 Bitmap 做 Xor 運算找出相異的點?

尚未結案
雪豆豆
一般會員


發表:19
回覆:22
積分:13
註冊:2002-08-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-08-24 22:15:01 IP:61.222.xxx.xxx 未訂閱
如題.. 兩個 TBitmap 分別存兩個影像 要怎樣透過運算找出相異的點.. 當然用回圈一個點一個點比對也可以 可是好慢喔. @@~ 有沒有快速的方式ㄌㄟ..
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-08-26 08:16:29 IP:61.219.xxx.xxx 未訂閱
這是我寫的一個比對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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-08-26 13:45:59 IP:61.219.xxx.xxx 未訂閱
off:=54 3*34; // 這理還有問題,不同的圖片,檔頭大小好像會不一樣 直接用這個offset可能不太可靠, DIB,DDB不同, 是否有colorMap也不一定, 甚至color plan不同也會影響, 大概還是必須仔細分析head 之Structure
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-08-26 14:32:05 IP:61.221.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-08-26 15:20:19 IP:61.219.xxx.xxx 未訂閱
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位置也會不同
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-08-26 16:18:07 IP:61.221.xxx.xxx 未訂閱
引言: 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討論區站長~~~
系統時間:2024-04-24 17:02:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!