C#实现为位图查找函数添加搜索起始偏移并返回坐标的问题
位图查找函数添加起始偏移功能的正确修改方案
问题原因
你仅修改了循环的初始值,缺少入参合法性校验,同时原有逻辑的边界判断存在小缺陷,所以导致功能异常。
具体修改步骤
- 新增
xFrom、yFrom的入参校验:两个值不能小于0,同时不能超过「大图宽/高减去小图宽/高」的最大合法起始值,否则直接返回匹配失败 - 将
outerX、outerY的循环初始值设置为xFrom、yFrom - 可选兼容优化:给
xFrom、yFrom设置默认值0,原有无需指定起始位置的调用不需要修改代码即可兼容 - 边界修复:将原有循环的边界判断从
<改为<=,避免漏掉最后一个合法的匹配起始位置
修改后完整代码
public static bool FindBitmap(Bitmap bmpNeedle, Bitmap bmpHaystack, out Point location, int xFrom = 0, int yFrom = 0) { location = Point.Empty; // 基础空值校验 if (bmpNeedle == null || bmpHaystack == null) { return false; } // 小图尺寸大于大图直接返回 if (bmpNeedle.Width > bmpHaystack.Width || bmpNeedle.Height > bmpHaystack.Height) { return false; } // 起始偏移合法性校验 int maxValidX = bmpHaystack.Width - bmpNeedle.Width; int maxValidY = bmpHaystack.Height - bmpNeedle.Height; if (xFrom < 0 || yFrom < 0 || xFrom > maxValidX || yFrom > maxValidY) { return false; } // 外层循环从指定起始位置开始遍历 for (int outerX = xFrom; outerX <= maxValidX; outerX++) { for (int outerY = yFrom; outerY <= maxValidY; outerY++) { bool isMatch = true; // 逐像素比对 for (int innerX = 0; innerX < bmpNeedle.Width; innerX++) { for (int innerY = 0; innerY < bmpNeedle.Height; innerY++) { Color cNeedle = bmpNeedle.GetPixel(innerX, innerY); Color cHaystack = bmpHaystack.GetPixel(innerX + outerX, innerY + outerY); if (cNeedle.R != cHaystack.R || cNeedle.G != cHaystack.G || cNeedle.B != cHaystack.B) { isMatch = false; break; } } if (!isMatch) { break; } } if (isMatch) { location = new Point(outerX, outerY); return true; } } } return false; }
补充说明
- 如果你不需要兼容旧调用,可以删掉参数后的默认值
=0,强制调用方传入起始偏移 - 代码中去掉了
goto语句,改用布尔变量控制跳出逻辑,可读性更好,功能和原有逻辑完全一致
内容的提问来源于stack exchange,提问作者prishelets
相关产品推荐
相关产品推荐

