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;
beginfor w := 0 to Image1.Width-1 dofor 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-цвета в оттенки серого с помощью алгоритма, состоящего из взвешенных сумм значений красного, зеленого и синего цветов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.