Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

Как преобразовать RGB-цвет в оттенки серого

Delphi , Графика и Игры , Цвета и Палитра

Как преобразовать RGB-цвет в оттенки серого



function RgbToGray(RGBColor: TColor): TColor;
var
  Gray: byte;
begin
  Gray := Round((0.30 * GetRValue(RGBColor)) +
  (0.59 * GetGValue(RGBColor)) +
  (0.11 * GetBValue(RGBColor )));
  Result := RGB(Gray, Gray, Gray);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  h, w: integer;
begin
  for w := 0 to Image1.Width-1 do
    for h := 0 to Image1.Height-1 do
      Image2.Canvas.Pixels[w, h] :=
      RgbToGray(Image2.Canvas.Pixels[w, h]);
end;

Here's a translation of the provided text into Russian:

Код, написанный на языке Pascal, используется для преобразования цветов RGB в значения серого. Функция RgbToGray принимает в качестве входного параметра цвет RGB и возвращает значение серого.

Конвертация работает следующим образом:

  • Она вычисляет значение серого, умножая каждый компонент (красный, зеленый, синий) на соответствующий вес: 0.30 для красного, 0.59 для зеленого и 0.11 для синего.
  • Сумма этих взвешенных компонентов затем округляется, чтобы получить окончательное значение серого.
  • Это значение серого используется для создания нового цвета RGB, где все три компонента равны.

Процедура Button1Click перебирает каждый пиксель в изображении, применяет функцию RgbToGray к преобразованию его в цвет серого и присваивает это значение другому изображению.

Вот несколько способов улучшить этот код:

  • Вместо использования жестких значений весов (0.30, 0.59, 0.11), рассмотрите возможность использования констант или переменных для лучшей читаемости и поддержки.
  • Функция RgbToGray может быть упрощена с помощью одиночной цикла, который перебирает каждый компонент цвета RGB.
  • Рассмотрите возможность добавления обработки ошибок для случаев, когда входной цвет не является валидным (например, он не находится в диапазоне [0, 255] для каждого компонента).
  • Вместо присваивания значения серого другому изображению пиксель за пикселем, рассмотрите возможность использования одиночной вызова метода Canvas.Draw, который рисует изображение целиком.

Вот пример рефакторинга кода:

const
  RedWeight  = 0.30;
  GreenWeight  = 0.59;
  BlueWeight  = 0.11;

function RgbToGray(RGBColor: TColor): TColor;
var
  Gray: byte;
begin
  Result := RGB(0, 0, 0);
  Gray := Round((RedWeight * GetRValue(RGBColor)) +
                  (GreenWeight * GetGValue(RGBColor)) +
                  (BlueWeight * GetBValue(RGBColor)));
  Result := RGB(Gray, Gray, Gray);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  for w := 0 to Image1.Width - 1 do
    for h := 0 to Image1.Height - 1 do
      Image2.Canvas.Pixels[w, h] := RgbToGray(Image1.Canvas.Pixels[w, h]);
end;

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

В статье описывается функция для преобразования RGB-цвета в оттенки серого с помощью алгоритма, состоящего из взвешенных сумм значений красного, зеленого и синего цветов.


Комментарии и вопросы


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Цвета и Палитра ::


реклама



©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru Rambler's Top100

Время компиляции файла: 2024-05-10 07:13:18
2024-05-19 14:02:20/0.006195068359375/0