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

C#技术问题:如何获取图像内5×5像素区域的颜色?

嘿,我一眼就看出问题啦!你用Bitmap.GetPixel()的时候传了4个参数,但这个方法根本没有接受4个参数的重载哦😯

从报错信息能明确看到:编译器找不到GetPixel(int, int, int, int)这个方法——因为.NET里的GetPixel()本来就只能获取单个像素的颜色,它的参数只有目标像素的x、y坐标,没有所谓的区域大小参数,这就是代码跑不起来的核心原因。

那如果要处理5×5的像素区域,该怎么做呢?给你两种常见的实现思路,看你需求选:

1. 遍历区域内的所有像素

如果你需要拿到这个5×5区域里每一个像素的颜色,可以用嵌套循环遍历每个坐标:

int xStart = 200;
int yStart = 100;
int regionSize = 5;

// 用using自动释放Bitmap资源,避免内存泄漏
using (Bitmap myBitmap = new Bitmap("C:/Users/admin/Desktop/image.png"))
{
    List<Color> regionColors = new List<Color>();

    for (int x = xStart; x < xStart + regionSize; x++)
    {
        for (int y = yStart; y < yStart + regionSize; y++)
        {
            // 必须判断坐标是否在图片范围内,防止越界报错
            if (x >= 0 && x < myBitmap.Width && y >= 0 && y < myBitmap.Height)
            {
                Color pixelColor = myBitmap.GetPixel(x, y);
                regionColors.Add(pixelColor);
            }
        }
    }

    // 示例:弹出第一个像素的颜色名称
    if (regionColors.Count > 0)
    {
        MessageBox.Show(regionColors[0].Name);
    }
}

2. 计算区域的平均颜色

如果你的需求是获取这个5×5区域的“代表色”,可以计算RGB通道的平均值:

int xStart = 200;
int yStart = 100;
int regionSize = 5;

using (Bitmap myBitmap = new Bitmap("C:/Users/admin/Desktop/image.png"))
{
    int totalRed = 0, totalGreen = 0, totalBlue = 0;
    int validPixelCount = 0;

    for (int x = xStart; x < xStart + regionSize; x++)
    {
        for (int y = yStart; y < yStart + regionSize; y++)
        {
            if (x >= 0 && x < myBitmap.Width && y >= 0 && y < myBitmap.Height)
            {
                Color pixel = myBitmap.GetPixel(x, y);
                totalRed += pixel.R;
                totalGreen += pixel.G;
                totalBlue += pixel.B;
                validPixelCount++;
            }
        }
    }

    if (validPixelCount > 0)
    {
        int avgR = totalRed / validPixelCount;
        int avgG = totalGreen / validPixelCount;
        int avgB = totalBlue / validPixelCount;

        Color avgColor = Color.FromArgb(avgR, avgG, avgB);
        MessageBox.Show(avgColor.Name);
    }
}

最后再提醒两个关键细节:

  • 一定要加坐标范围判断,不然如果你的起始坐标加上5超出了图片的宽高,会直接抛出越界异常
  • 永远记得释放Bitmap资源,用using语句是最省心的方式,不用手动调用Dispose()

内容的提问来源于stack exchange,提问作者CrownFord

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:23:54