C# 如何在C语言中从图像的特定区域获取颜色

C# 如何在C语言中从图像的特定区域获取颜色,c#,image,C#,Image,我试图从图像中的特定区域获得颜色 假设,这是图像,我想得到图像内部的颜色。结果应该是上面图像的红色。这种颜色可能在图像中的不同位置。因为我不知道颜色的确切位置,所以我不能得到确切的结果 到目前为止,我裁剪了图像,手动给出了x和y的位置,然后裁剪了图像,得到了裁剪图像的平均颜色。但我知道,这不是确切的颜色 我尝试的是: private RgbDto GetRGBvalueCroppedImage(Image croppedImage) { var avgRgb =

我试图从图像中的特定区域获得颜色

假设,这是图像,我想得到图像内部的颜色。结果应该是上面图像的红色。这种颜色可能在图像中的不同位置。因为我不知道颜色的确切位置,所以我不能得到确切的结果

到目前为止,我裁剪了图像,手动给出了x和y的位置,然后裁剪了图像,得到了裁剪图像的平均颜色。但我知道,这不是确切的颜色

我尝试的是:

private RgbDto GetRGBvalueCroppedImage(Image croppedImage)
        {
        var avgRgb = new RgbDto();
        var bm = new Bitmap(croppedImage);


        BitmapData srcData = bm.LockBits(
            new Rectangle(0, 0, bm.Width, bm.Height),
            ImageLockMode.ReadOnly,
            PixelFormat.Format32bppArgb);

        int stride = srcData.Stride;

        IntPtr Scan0 = srcData.Scan0;

        long[] totals = new long[] { 0, 0, 0 };

        int width = bm.Width;
        int height = bm.Height;

        unsafe
        {
            byte* p = (byte*)(void*)Scan0;

            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    for (int color = 0; color < 3; color++)
                    {
                        int idx = (y * stride) + x * 4 + color;

                        totals[color] += p[idx];
                    }
                }
            }
        }

        avgRgb.avgB = (int)totals[0] / (width * height);
        avgRgb.avgG = (int)totals[1] / (width * height);
        avgRgb.avgR = (int)totals[2] / (width * height);

        return avgRgb;
    }

我怎样才能得到修剪的准确位置?也许我可以把图像转换成字节数组,然后我可以找到不同的颜色,对它进行定位,然后裁剪。但是我不知道怎么做。

如果你想得到图像的颜色,你根本不需要做任何裁剪。只需在图像像素上循环,找到两种不同的颜色。假设您已经知道图像将有2种颜色,正如您在评论中所说。我已经编写了一个小函数来实现这一点。但是,我没有在IDE中测试它,因此可能会出现一些小错误:

私有静态颜色[]GetColorsImage图像 { var bmp=新的位图图像; 变量颜色=新颜色[2]; 颜色[0]=bmp.GetPixel0,0; 对于int i=0;i如果你想得到图像的颜色,你根本不需要做任何裁剪。只需在图像像素上循环,找到两种不同的颜色。假设您已经知道图像将有2种颜色,正如您在评论中所说。我已经编写了一个小函数来实现这一点。但是,我没有在IDE中测试它,因此可能会出现一些小错误:

私有静态颜色[]GetColorsImage图像 { var bmp=新的位图图像; 变量颜色=新颜色[2]; 颜色[0]=bmp.GetPixel0,0; 对于int i=0;i您可以使用这种扩展方法获得图像区域的主色,以防它们不完全相同

public static Color GetDominantColor(this Bitmap bitmap, int startX, int startY, int width, int height) {

    var maxWidth = bitmap.Width;
    var maxHeight = bitmap.Height;

    //TODO: validate the region being requested

    //Used for tally
    int r = 0;
    int g = 0;
    int b = 0;
    int totalPixels = 0;

    for (int x = startX; x < (startX + width); x++) {
        for (int y = startY; y < (startY + height); y++) {
            Color c = bitmap.GetPixel(x, y);

            r += Convert.ToInt32(c.R);
            g += Convert.ToInt32(c.G);
            b += Convert.ToInt32(c.B);

            totalPixels++;
        }
    }

    r /= totalPixels;
    g /= totalPixels;
    b /= totalPixels;

    Color color = Color.FromArgb(255, (byte)r, (byte)g, (byte)b);

    return color;
}
还有改进的余地,比如使用点和大小,甚至是矩形

public static Color GetDominantColor(this Bitmap bitmap, Rectangle area) {
    return bitmap.GetDominantColor(area.X, area.Y, area.Width, area.Height);
}
以下连结:
您可以使用这种扩展方法获得图像某个区域的主色调,以防它们不完全相同

public static Color GetDominantColor(this Bitmap bitmap, int startX, int startY, int width, int height) {

    var maxWidth = bitmap.Width;
    var maxHeight = bitmap.Height;

    //TODO: validate the region being requested

    //Used for tally
    int r = 0;
    int g = 0;
    int b = 0;
    int totalPixels = 0;

    for (int x = startX; x < (startX + width); x++) {
        for (int y = startY; y < (startY + height); y++) {
            Color c = bitmap.GetPixel(x, y);

            r += Convert.ToInt32(c.R);
            g += Convert.ToInt32(c.G);
            b += Convert.ToInt32(c.B);

            totalPixels++;
        }
    }

    r /= totalPixels;
    g /= totalPixels;
    b /= totalPixels;

    Color color = Color.FromArgb(255, (byte)r, (byte)g, (byte)b);

    return color;
}
还有改进的余地,比如使用点和大小,甚至是矩形

public static Color GetDominantColor(this Bitmap bitmap, Rectangle area) {
    return bitmap.GetDominantColor(area.X, area.Y, area.Width, area.Height);
}
以下连结:

你能保证图像中有两种颜色吗?你能举个真实的例子吗?这真的是单色图像和一个矩形区域吗?@Youssef13是的,我需要图像中的内部颜色。我不明白你想要实现什么。你说结果应该是上面图像的红色,然后你问我如何才能得到准确的位置进行裁剪?。所以你到底想要什么?你必须至少知道一些可以使用的东西所有的盒子都有一种典型的颜色吗?或者它们也可以有不同的颜色?标签是否具有平均大小范围?或者它们可以是图像的0%到100%之间的任何颜色?你能保证图像中正好有2种颜色吗?你能给出一个真实的例子吗?这真的是单色图像和一个矩形区域吗?@Youssef13是的,我需要图像中的内部颜色。我不明白你想要实现什么。你说结果应该是上面图像的红色,然后你问我如何才能得到准确的位置进行裁剪?。所以你到底想要什么?你必须至少知道一些可以使用的东西所有的盒子都有一种典型的颜色吗?或者它们也可以有不同的颜色?标签是否具有平均大小范围?或者它们可以是图像的0%到100%之间的任何内容?