У меня есть растровое изображение, и я хочу получить значения цвета из пикселей, но только в определенных областях изображения. Я хочу получить пиксели изображения для полной ширины и только немного высоты (скажем, height = 1), а затем я хочу переместить позицию на единицу вниз и получить те же значения.

Я использую

for (int i = 0; i < 302; i++)
{ 
    Rectangle cloneRect = new Rectangle(0, i, 514, 1);
    System.Drawing.Imaging.PixelFormat format = bm.PixelFormat;
    Bitmap cloneBitmap = bm.Clone(cloneRect, format);
    bitMapList.Add(cloneBitmap);
}

foreach (Bitmap bmp in bitMapList)
{
    c = bmp.GetPixel(514, 1);
    r = Convert.ToInt16(c.R);
    lumi.Add(r);
}

Оператор for для создания областей, которые я хочу на растровом изображении, а затем foreach для цикла по этим растровым изображениям, а затем для получения значений. Единственная проблема в том, что я получаю сообщение об ошибке «Параметр должен быть положительным и <Ширина».

На линии

c = bmp.GetPixel(514, 1);

Кто-нибудь знает почему?

Благодарность

0
user3244139 10 Мар 2014 в 18:50

2 ответа

Лучший ответ

Вам необходимо убедиться, что получаемый пиксель находится внутри изображения (что не должно быть так). Вы можете заключить это в вызов, чтобы сначала запустить проверку, например:

public static Color GetPixelSafe(Bitmap image, int x, int y) {
    if (x >= image.Width) x = image.Width - 1;
    else if (x < 0) x = 0;
    if (y >= image.Height) y = image.Height - 1;
    else if (y < 0) y = 0;

    return image.GetPixel(x, y);
}

Теперь это не исправит ваш алгоритм обработки, но должно, по крайней мере, исправить исключение. Еще один указатель: если вы собираетесь обрабатывать много значений цвета, и производительность является проблемой, вам действительно стоит подумать об использовании image.LockBits вместо GetPixel. Дополнительную информацию об этом см. Здесь: http: // msdn.microsoft.com/en-us/library/5ey6h79d(v=vs.110).aspx.

0
drew_w 10 Мар 2014 в 18:58
Это сработало спасибо! Я просто создаю базовую версию, чтобы посмотреть, будет ли она работать, посмотрю на изображение.LockBits, так что спасибо и за это!
 – 
user3244139
10 Мар 2014 в 19:14

Кажется, что 514 больше, чем фактическая ширина вашего изображения. Как вы пришли к этому числу?

0
Adrian Zanescu 10 Мар 2014 в 18:58
Ширина моего изображения 514
 – 
user3244139
10 Мар 2014 в 19:00
И пиксели основаны на 0, так что это означает, что число должно быть 513. В любом случае, почему вы жестко кодируете это? Вы всегда будете работать с изображениями шириной 514?
 – 
Adrian Zanescu
10 Мар 2014 в 19:03
Нет, это не будет жестко закодировано в будущем, но на данный момент я делаю это очень просто, просто чтобы проверить, могу ли я это сделать
 – 
user3244139
10 Мар 2014 в 19:06