Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Преобразование изображений в сепию и окрашивание в выбранный цвет: новый подход в обработке изображений

Delphi , Графика и Игры , Изображения

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

Преобразование изображения в оттенки серого и цветное окрашивание

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

Ключевой момент в алгоритме — это определение смещения для каждого канала, которое будет использоваться для изменения оттенка серого в новый цвет. Параметр depth становится излишним, так как смещение может быть вычислено на основе самого цвета.

procedure BmpToOneColor(const bmp: TBitmap; NewColor: TColor);
var
  color, r, g, b, rr, gg, bb, rbase, gbase, bbase, base, rdepth, gdepth, bdepth: Byte;
  h, w: Integer;
begin
  rbase := GetRValue(NewColor);
  gbase := GetGValue(NewColor);
  bbase := GetBValue(NewColor);
  base := Min(rbase, Min(gbase, bbase));
  rdepth := rbase - base;
  gdepth := gbase - base;
  bdepth := bbase - base;
  for h := 0 to bmp.Height - 1 do
  begin
    for w := 0 to bmp.Width - 1 do
    begin
      color := bmp.Canvas.Pixels[w, h];
      r := GetRValue(color);
      g := GetGValue(color);
      b := GetBValue(color);
      color := RGB(Clamp(r + rdepth, 0, 255),
                   Clamp(g + gdepth, 0, 255),
                   Clamp(b + bdepth, 0, 255));
      bmp.Canvas.Pixels[w, h] := color;
    end;
  end;
end;

function Clamp(const Value, MinValue, MaxValue: Integer): Integer;
begin
  if Value < MinValue then
    Exit(MinValue)
  else if Value > MaxValue then
    Exit(MaxValue)
  else
    Exit(Value);
end;

Обратите внимание, что вместо использования Pixels, мы могли бы использовать ScanLine для улучшения производительности, особенно при работе с большими изображениями.

Заключение

Мы рассмотрели способ преобразования изображения в оттенки серого и последующего окрашивания его в любой выбранный цвет. Это расширение стандартного алгоритма сепии позволяет разработчикам легко экспериментировать с цветом и создавать разнообразные визуальные эффекты. Использование Object Pascal (Delphi) делает данный подход доступным для широкого круга разработчиков, знакомых с этой экосистемой.

Создано по материалам из источника по ссылке.

Контекст касается модификации алгоритма преобразования изображений в сепию для возможности окрашивания изображения в выбранный пользователем цвет, используя языки программирования, такие как Delphi и Pascal.


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

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Изображения ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-20 22:54:49/0.0032258033752441/0