怎么将2张图片做减法,找出不同的地方(100分+100RMB)
如何将2张图片做减法,找出不同的地方(100分+100RMB)
要求实现这样的功能:
按下按键后,连续在窗体上截屏2张图片(时间间隔为0.1秒),然后将这2张图片做减法计算,将会只剩下某一个点(或者一个圈),得出该点或者该圈的中心坐标。
100分不足以我的感谢,所以另用淘宝支付100RMB当作酬劳。
可以实现该功能者请直接加我扣扣:一零九九七三。谢谢
------解决方案--------------------
没事的,我也是借大家的需求"复习+学习"一下,代码发上来供你参考,QQ木有,不好意思。
要求实现这样的功能:
按下按键后,连续在窗体上截屏2张图片(时间间隔为0.1秒),然后将这2张图片做减法计算,将会只剩下某一个点(或者一个圈),得出该点或者该圈的中心坐标。
100分不足以我的感谢,所以另用淘宝支付100RMB当作酬劳。
可以实现该功能者请直接加我扣扣:一零九九七三。谢谢
------解决方案--------------------
没事的,我也是借大家的需求"复习+学习"一下,代码发上来供你参考,QQ木有,不好意思。
- Delphi(Pascal) code
unit Unit1; interface uses 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;