C #, Как получить цвет определенной области внутри изображения - PullRequest
0 голосов
/ 17 мая 2018

Как получить цвет области с размером 5x5 пикселей внутри изображения.

int xPixel = 200; int yPixel = 100;                               
Bitmap myBitmap = new Bitmap(“C:/Users/admin/Desktop/image.png");  
Color pixelColor = myBitmap.GetPixel(xPixel, yPixel, 5, 5); 
MessageBox.Show(pixelColor.Name);

Этот код не работает !.enter image description here

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Решение, использующее фактические методы рисования, предоставляемые System.Drawing, для изменения размера данной области до 1x1 и получения значения его пикселя:

public static Color GetRectangleColor(Bitmap sourceBitmap, Int32 x, Int32 y, Int32 width, Int32 height)
{
    using(Bitmap onePix = new Bitmap(1,1, PixelFormat.Format24bppRgb))
    {
        using (Graphics pg = Graphics.FromImage(onePix)){
            pg.DrawImage(sourceBitmap,
                         new Rectangle(0, 0, 1, 1),
                         new Rectangle(x, y, width, height)),
                         GraphicsUnit.Pixel);
        return onePix.GetPixel(0, 0);
    }
}

Хотя, если вы постоянно работаете с квадратами одинакового цвета, я лично не стал бы беспокоиться. Просто избегайте любых потенциальных замираний по краям, и все в порядке:

public static Color GetRectangleCenterColor(Bitmap sourceBitmap, Int32 x, Int32 y, Int32 width, Int32 height)
{
    return sourceBitmap.GetPixel(x + (width / 2), y + (height / 2));
}
0 голосов
/ 17 мая 2018

Этот метод расширения можно использовать для получения доминирующего цвета в области изображения в случае, если они не все одинаковые

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;
}

Затем можно использовать его как

Color pixelColor = myBitmap.GetDominantColor(xPixel, yPixel, 5, 5); 

есть место для улучшений, таких как Point и Size или даже Rectangle

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

, но этого должно быть достаточно для начала.

...