public virtual void StartSearch(Bitmap searchFor, Rectangle searchArea, Point startFrom, int maxCount, int tolerance) { BitmapHelper.CheckBitmap(searchFor); _searchFor = BitmapHelper.CloneBitmap(searchFor); _startFrom = startFrom; _tolerance = tolerance * 0xfe01 / 100; _searchStarted = true; _maxCount = maxCount; _searchFinished = false; var rectangle = searchArea; rectangle.Intersect(new Rectangle(0, 0, _searchOn.Width, _searchOn.Height)); rectangle.Width -= _searchFor.Width - 1; rectangle.Height -= _searchFor.Height - 1; _sl = rectangle.Left; _st = rectangle.Top; _sr = rectangle.Right; _sb = rectangle.Bottom; _startFrom.X -= _searchFor.Width / 2; _startFrom.Y -= _searchFor.Height / 2; if (_startFrom.X < _sl) { _startFrom.X = _sl; } if (_startFrom.Y < _st) { _startFrom.Y = _st; } if (_startFrom.X >= _sr) { _startFrom.X = _sr - 1; } if (_startFrom.Y >= _sb) { _startFrom.Y = _sb - 1; } _maxOffset = Math.Max(Math.Max(_startFrom.X - _sl, _sr - _startFrom.X), Math.Max(_startFrom.Y - _st, _sb - _startFrom.Y)); _x = _startFrom.X; _y = _startFrom.Y; _offset = 0; _i = 1; _pos = 0; _result = new ArrayList(_maxCount); }
protected Rectangle ExpandToRight(Rectangle rect) { var rectangle = rect; var num = rect.Right - _topRightData.Width + 1; var y = rect.Y; var num3 = rect.Bottom - _bottomRightData.Height; for (var i = num; i < _sr; i++) { if (!BitmapHelper.CompareBitmapLocked(_searchOnData, _topRightData, i, y, _tolerance) || !BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomRightData, i, num3, _tolerance)) { return(rectangle); } rectangle.Width++; } return(rectangle); }
protected Rectangle ExpandToBottom(Rectangle rect) { var rectangle = rect; var x = rect.X; var num2 = rect.Right - _bottomRightData.Width; var num3 = rect.Bottom - _bottomRightData.Height + 1; for (var i = num3; i < _sb; i++) { if (!BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomLeftData, x, i, _tolerance) || !BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomRightData, num2, i, _tolerance)) { return(rectangle); } rectangle.Height++; } return(rectangle); }
protected Rectangle ExpandToTop(Rectangle rect) { var rectangle = rect; var x = rect.X; var num2 = rect.Right - _topRightData.Width; var num3 = rect.Y - 1; for (var i = num3; i >= _st; i--) { if (!BitmapHelper.CompareBitmapLocked(_searchOnData, _topLeftData, x, i, _tolerance) || !BitmapHelper.CompareBitmapLocked(_searchOnData, _topRightData, num2, i, _tolerance)) { return(rectangle); } rectangle.Y--; rectangle.Height++; } return(rectangle); }
protected Rectangle ExpandToLeft(Rectangle rect) { var rectangle = rect; var num = rect.X - 1; var y = rect.Y; var num3 = rect.Bottom - _bottomLeftData.Height; for (var i = num; i >= _sl; i--) { if (!BitmapHelper.CompareBitmapLocked(_searchOnData, _topLeftData, i, y, _tolerance) || !BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomLeftData, i, num3, _tolerance)) { return(rectangle); } rectangle.X--; rectangle.Width++; } return(rectangle); }
public override Rectangle FindNext() { Rectangle rectangle; _topLeftData = null; _topRightData = null; _bottomLeftData = null; _bottomRightData = null; try { _topLeftData = BitmapHelper.LockBits(_topLeft, ImageLockMode.ReadOnly); _topRightData = BitmapHelper.LockBits(_topRight, ImageLockMode.ReadOnly); _bottomLeftData = BitmapHelper.LockBits(_bottomLeft, ImageLockMode.ReadOnly); _bottomRightData = BitmapHelper.LockBits(_bottomRight, ImageLockMode.ReadOnly); rectangle = base.FindNext(); } finally { if (_topLeftData != null) { BitmapHelper.UnlockBits(_topLeft, _topLeftData); } if (_topRightData != null) { BitmapHelper.UnlockBits(_topRight, _topRightData); } if (_bottomLeftData != null) { BitmapHelper.UnlockBits(_bottomLeft, _bottomLeftData); } if (_bottomRightData != null) { BitmapHelper.UnlockBits(_bottomRight, _bottomRightData); } } return(rectangle); }
protected override bool CheckLocation(int x, int y) { if ((x >= _sl) && (y >= _st) && (x < _sr) && (y < _sb)) { switch (_startCorner) { case 0: if (BitmapHelper.CompareBitmapLocked(_searchOnData, _topLeftData, x, y, _tolerance)) { for (var i = x + _topLeft.Width; i < _sr; i++) { if (BitmapHelper.CompareBitmapLocked(_searchOnData, _topRightData, i, y, _tolerance)) { for (var j = y + _topLeft.Height; j < _sb; j++) { if ( BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomRightData, i, j, _tolerance) && BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomLeftData, x, j, _tolerance)) { var rectangle = Expand(Rectangle.FromLTRB(x, y, i + _bottomRight.Width, j + _bottomRight.Height)); _result.Add(rectangle); rectangle.Inflate(-1, -1); MaskRectangle(rectangle); return(true); } } } } } break; case 1: if (BitmapHelper.CompareBitmapLocked(_searchOnData, _topRightData, x, y, _tolerance)) { for (var k = y + _topRight.Height; k < _sb; k++) { if (BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomRightData, x, k, _tolerance)) { for (var m = x - _bottomLeft.Width; m >= _sl; m--) { if ( BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomLeftData, m, k, _tolerance) && BitmapHelper.CompareBitmapLocked(_searchOnData, _topLeftData, m, y, _tolerance)) { var rectangle2 = Expand(Rectangle.FromLTRB(m, y, x + _topRight.Width, k + _bottomRight.Height)); _result.Add(rectangle2); rectangle2.Inflate(-1, -1); MaskRectangle(rectangle2); return(true); } } } } } break; case 2: if (BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomLeftData, x, y, _tolerance)) { for (var n = y - _topLeft.Height; n >= _st; n--) { if (BitmapHelper.CompareBitmapLocked(_searchOnData, _topLeftData, x, n, _tolerance)) { for (var num6 = x + _topLeft.Width; num6 < _sr; num6++) { if ( BitmapHelper.CompareBitmapLocked(_searchOnData, _topRightData, num6, n, _tolerance) && BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomRightData, num6, y, _tolerance)) { var rectangle3 = Expand(Rectangle.FromLTRB(x, n, num6 + _topRight.Width, y + _bottomLeft.Height)); _result.Add(rectangle3); rectangle3.Inflate(-1, -1); MaskRectangle(rectangle3); return(true); } } } } } break; case 3: if (BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomRightData, x, y, _tolerance)) { for (var num7 = x - _bottomLeft.Width; num7 >= _sl; num7--) { if (BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomLeftData, num7, y, _tolerance)) { for (var num8 = y - _topLeft.Height; num8 >= _st; num8--) { if ( BitmapHelper.CompareBitmapLocked(_searchOnData, _topLeftData, num7, num8, _tolerance) && BitmapHelper.CompareBitmapLocked(_searchOnData, _topRightData, x, num8, _tolerance)) { var rectangle4 = Expand(Rectangle.FromLTRB(num7, num8, x + _bottomRight.Width, y + _bottomRight.Height)); _result.Add(rectangle4); rectangle4.Inflate(-1, -1); MaskRectangle(rectangle4); return(true); } } } } } break; } } return(false); }
public virtual Rectangle FindNext() { Rectangle empty; _searchOnData = null; _searchForData = null; try { _searchOnData = BitmapHelper.LockBits(_searchOn, ImageLockMode.ReadOnly); _searchForData = BitmapHelper.LockBits(_searchFor, ImageLockMode.ReadOnly); if (_searchFinished) { return(Rectangle.Empty); } if (!_searchStarted) { throw new ApplicationException( "Search is not started. Use StartSearch prior to calling FindNext"); } if (_offset != 0) { goto Label_02CE; } _offset++; if (!CheckLocation(_x, _y)) { goto Label_02CE; } return((Rectangle)_result[_result.Count - 1]); Label_00A3: switch (_pos) { case 0: _x0 = _x - _i + 1; _y0 = _y - _offset; break; case 1: _x0 = _x + _i; _y0 = _y - _offset; break; case 2: _x0 = _x + _offset; _y0 = _y - _i + 1; break; case 3: _x0 = _x + _offset; _y0 = _y + _i; break; case 4: _x0 = _x + _i - 1; _y0 = _y + _offset; break; case 5: _x0 = _x - _i; _y0 = _y + _offset; break; case 6: _x0 = _x - _offset; _y0 = _y + _i - 1; break; case 7: _x0 = _x - _offset; _y0 = _y - _i; break; } _pos++; if (CheckLocation(_x0, _y0)) { if (_result.Count <= _maxCount) { return((Rectangle)_result[_result.Count - 1]); } return(Rectangle.Empty); } Label_028A: if (_pos < 8) { goto Label_00A3; } _i++; _pos = 0; Label_02AB: if (_i <= _offset) { goto Label_028A; } _offset++; _i = 1; Label_02CE: if (_offset <= _maxOffset) { goto Label_02AB; } _searchFinished = true; empty = Rectangle.Empty; } finally { if (_searchForData != null) { BitmapHelper.UnlockBits(_searchFor, _searchForData); } if (_searchOnData != null) { BitmapHelper.UnlockBits(_searchOn, _searchOnData); } } return(empty); }
public BitmapSearch(Bitmap searchOn) { _searchOn = BitmapHelper.CloneBitmap(searchOn); }
protected void MaskRectangle(Rectangle R) { BitmapHelper.MaskRectangle(_searchOnData, R, true); }