Сопоставление яркости изображения с фиксированным набором выбранных пользователем цветов в WinForms.C#

Место общения программистов C#
Anonymous
Сопоставление яркости изображения с фиксированным набором выбранных пользователем цветов в WinForms.

Сообщение Anonymous »

Я работаю над приложением WinForms на C#, где я обрабатываю растровое изображение попиксельно и перераспределяю его цвета в зависимости от яркости.
Что оно делает:
  • Позволяет пользователю выбирать 5 цветов на цветовой панели
  • Находит яркость каждого отдельного пикселя
  • Замените пиксель на один из выбранных цветов в зависимости от диапазонов яркости
Код выглядит следующим образом:

Код: Выделить всё

private void fiveColorsToolStripMenuItem_Click(object sender, EventArgs e)

{

Color currentPixel;

int brightness;

Bitmap sourceBitmap = btm.Bitmapa;

Bitmap resultBitmap = new Bitmap(sourceBitmap);

Color chosenColor = colorDialog.Color;

Color[] colorArray = new Color[5]; // array with five colors

for (int index = 0; index < 5; index++)

{

if (colorDialog.ShowDialog() == DialogResult.OK)

{

colorArray[index] = colorDialog.Color;

}

}

for (int x = 0; x < sourceBitmap.Width; x++)

{

for (int y = 0; y < sourceBitmap.Height; y++)

{

currentPixel = sourceBitmap.GetPixel(x, y);

brightness = btm.brightness(currentPixel);

Color newColor = new Color();

if (brightness < 50)

{

newColor = Color.FromArgb(Convert.ToInt32(colorArray[4].R), Convert.ToInt32(colorArray[4].G), Convert.ToInt32(colorArray[4].B));

}

else if (brightness >= 50 && brightness < 100)

{

newColor = Color.FromArgb(Convert.ToInt32(colorArray[3].R), Convert.ToInt32(colorArray[3].G), Convert.ToInt32(colorArray[3].B));

}

else if (brightness >= 100 && brightness < 150)

{

newColor = Color.FromArgb(Convert.ToInt32(colorArray[2].R), Convert.ToInt32(colorArray[2].G), Convert.ToInt32(colorArray[2].B));

}

else if (brightness >= 150 && brightness < 200)

{

newColor = Color.FromArgb(Convert.ToInt32(colorArray[1].R), Convert.ToInt32(colorArray[1].G), Convert.ToInt32(colorArray[1].B));

}

else if (brightness >= 200)

{

newColor = Color.FromArgb(colorArray[0].R, colorArray[0].G, colorArray[0].B);

}

resultBitmap.SetPixel(x, y, newColor);

}

}

btm.Bitmapa = resultBitmap; //Bitmapa is an atribute

btm.zobrazitBitovouMapu(new Point(0, 0), Form.ActiveForm);

}
Код работает, но у меня есть два вопроса:
  • Есть ли лучший способ выполнить часть if/else if? Кажется, что для выполнения этой задачи требуется много кода.
  • Оптимально ли использовать Get/SetPixel или мне следует использовать что-то получше?

Вернуться в «C#»