首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

怎么将2张图片做减法,找出不同的地方(100分+100RMB)

2012-04-18 
如何将2张图片做减法,找出不同的地方(100分+100RMB)要求实现这样的功能:按下按键后,连续在窗体上截屏2张图

如何将2张图片做减法,找出不同的地方(100分+100RMB)
要求实现这样的功能:
按下按键后,连续在窗体上截屏2张图片(时间间隔为0.1秒),然后将这2张图片做减法计算,将会只剩下某一个点(或者一个圈),得出该点或者该圈的中心坐标。
100分不足以我的感谢,所以另用淘宝支付100RMB当作酬劳。
可以实现该功能者请直接加我扣扣:一零九九七三。谢谢

[解决办法]
没事的,我也是借大家的需求"复习+学习"一下,代码发上来供你参考,QQ木有,不好意思。

Delphi(Pascal) code
unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, ActiveX, StdCtrls, ExtCtrls, OleCtrls, SHDocVw;type  TForm1 = class(TForm)    wb1: TWebBrowser;    Image1: TImage;    Button1: TButton;    procedure Button1Click(Sender: TObject);    procedure FormCreate(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end;var  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);var        mView: IViewObject;  //uses ActiveX        mRect: TRect;        i,j: integer;        mColor: integer;begin        if wb1.Document = nil then                exit;        if succeeded(wb1.Document.QueryInterface(IViewObject,mView)) then        begin                mRect := Rect(0,0,wb1.Width,wb1.Height);                mView.Draw(DVASPECT_CONTENT,1,nil,nil,Handle,Image1.Canvas.Handle,@mRect,nil,nil,0);                mView._Release;                //从Image1里取颜色值                mColor := Image1.Canvas.Pixels[50,50];                //mColor := RGB(100,100,100);                for i:=0 to Image1.Width-1 do                        for j:=0 to Image1.Height-1 do                        begin                                if Image1.Canvas.Pixels[i,j]=mColor then                                begin                                        showmessage(IntToStr(i)+','+IntToStr(j));                                end;                        end;        end;end;procedure TForm1.FormCreate(Sender: TObject);begin        wb1.Navigate('http://localhost:12280/mtm/test.htm');        Image1.Width := 100;        Image1.Height := 100;end;end.
[解决办法]
你这个其实只要将两次获取的图片进行异或就可以了。我用的三个bmp,第一个第二个用来存放第一次第二次截取的图片,第三个用来存放XOR的结果,最后把三个图片显示到窗体的三个Image控件上面,获取坐标只获取了第一个点,如果多个点要全部取出来再求中心点,如果取回(0,0)代表两次截取的图片是一致的,XOR的结果为像素全0的图片,一张黑色的图片。
Delphi(Pascal) code
procedure TfrmMain.btnXorClick(Sender: TObject);var  dc: HDC;  bmp1,bmp2,bmp3: TBitmap;  pt: TPoint;const  WW=220; //Width  HH=160; //Height  XX=0;   //X Coordinate  YY=0;   //Y Coordinate  _SLEEP = 100; //Sleep times  procedure BitBltEx(aBMP: TBitmap; X, Y, PW, PH: integer);  begin    aBMP.PixelFormat := pf24bit;    aBMP.Width := PW;    aBMP.Height := PH;    BitBlt(aBMP.Canvas.Handle, 0, 0, PW, PH, dc, X, Y, SRCCOPY);  end;  procedure BmpXor(aBMP1,aBMP2,aBMP3: TBitmap);  var    i,j: Integer;    p1,p2,p3: pByteArray;  begin    for i := 0 to aBMP1.Height - 1 do    begin      p1 := aBMP1.ScanLine[i];      p2 := aBMP2.ScanLine[i];      p3 := aBMP3.ScanLine[i];      for j := 0 to aBMP1.Width - 1 do      begin        p3[3 * j + 2] := p1[3 * j + 2] xor p2[3 * j + 2];        p3[3 * j + 1] := p1[3 * j + 1] xor p2[3 * j + 1];        p3[3 * j + 0] := p1[3 * j + 0] xor p2[3 * j + 0];      end;    end;  end;  function GetCoordinate(aBMP: TBitmap): TPoint;  var    i,j,found: Integer;    p: pByteArray;    arrTemp: array of Byte;  begin    Result := Point(0,0);    found := 0;    SetLength(arrTemp,aBMP.Width * 3);    ZeroMemory(arrTemp,aBMP.Width * 3);    for i := 0 to aBMP.Height - 1 do    begin      p := aBMP.ScanLine[i];      if CompareMem(p,arrTemp,aBMP.Width * 3) then        Continue      else        for j := 0 to aBMP.Width - 1 do        begin          if (p[3 * j + 2]>0) or (p[3 * j + 1]>0) or (p[3 * j + 0]>0) then          begin            found := 1;            Result := Point(j,i);            Break;          end;          end;      if found > 0 then Break;          end;  end;begin  dc := CreateDC('DISPLAY', nil, nil, nil);  bmp1 := TBitmap.Create;  bmp2 := TBitmap.Create;  bmp3 := TBitmap.Create;  try    BitBltEx(bmp1,XX,YY,WW,HH);    Sleep(_SLEEP);    BitBltEx(bmp2,XX,YY,WW,HH);    BitBltEx(bmp3,XX,YY,WW,HH);    BmpXor(bmp1,bmp2,bmp3);        Image1.Picture.Bitmap.Assign(bmp1);    Image2.Picture.Bitmap.Assign(bmp2);    Image3.Picture.Bitmap.Assign(bmp3);    pt := GetCoordinate(bmp3);    ShowMessageFmt('X:%d,Y:%d',[pt.X,pt.Y]);  finally    bmp1.Free;    bmp2.Free;    bmp3.Free;    DeleteDC(dc);  end;end; 

热点排行