You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:27:02