Сопоставление яркости изображения с фиксированным набором выбранных пользователем цветов в 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#»