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

Расширение функционала фильтра цветовых оттенков для работы с насыщенностью и светлотой: HSL в Delphi

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

 

Вопрос, поставленный пользователем Craig, касается расширения возможностей фильтра цветовых оттенков TFilterHueAdjust для работы не только с оттенком (Hue), но и с насыщенностью (Saturation) и светлотой (Light) в модели HSL. В контексте заданного вопроса уже предложено решение, которое заключается в использовании свойства InputFilter для последовательного применения нескольких фильтров. Ниже приведен пошаговый пример реализации данного решения с использованием Object Pascal.

Шаг 1: Создание функции для корректировки HSL

Для начала создадим функцию AdjustHSL, которая будет принимать исходное изображение, целевое изображение, а также значения H, S и L.

procedure AdjustHSL(Source, Dest: TBitmap; H, S, L: Single);
var
  HueFilter: TFilterHueAdjust;
  ContrastFilter: TFilterContrast;
begin
  // Создаем фильтр для коррекции оттенка
  HueFilter := TFilterHueAdjust.Create(nil);
  try
    HueFilter.Input := Source;
    HueFilter.Hue := H;

    // Создаем фильтр для коррекции контраста, который будет использовать результат работы HueFilter
    ContrastFilter := TFilterContrast.Create(nil);
    try
      ContrastFilter.InputFilter := HueFilter; // Применяем HueFilter как вход для ContrastFilter
      ContrastFilter.Brightness := L; // Устанавливаем уровень яркости
      ContrastFilter.Contrast := S; // Устанавливаем уровень контраста как насыщенность
      Dest.Assign(ContrastFilter.Output); // Присваиваем результат работы фильтра целевому изображению
    finally
      ContrastFilter.Free;
    end;
  finally
    HueFilter.Free;
  end;
end;

Шаг 2: Применение функции

После создания функции, её можно использовать для изменения HSL любого изображения. Вот пример использования этой функции:

var
  BitmapSource, BitmapDest: TBitmap;
begin
  // Инициализация исходного и целевого изображений
  BitmapSource := TBitmap.Create;
  try
    BitmapSource.LoadFromFile('path_to_source_image.bmp');

    BitmapDest := TBitmap.Create;
    try
      BitmapDest.Width := BitmapSource.Width;
      BitmapDest.Height := BitmapSource.Height;

      // Применение функции AdjustHSL с заданными параметрами H, S, L
      AdjustHSL(BitmapSource, BitmapDest, HValue, SValue, LValue);

      // Сохранение измененного изображения
      BitmapDest.SaveToFile('path_to_destination_image.bmp');
    finally
      BitmapDest.Free;
    end;
  finally
    BitmapSource.Free;
  end;
end;

Альтернативное решение

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

type
  TBaseFilter = class
  private
    FInput: TBitmap;
    FOutput: TBitmap;
    FInputFilter: TBaseFilter;
    function GetOutput: TBitmap; virtual;
  public
    property Input: TBitmap read FInput write SetInput;
    property InputFilter: TBaseFilter read FInputFilter write SetInputFilter;
    property Output: TBitmap read GetOutput;
    constructor Create(AOwner: TComponent = nil); virtual;
    destructor Destroy; override;
  end;

  THueFilter = class(TBaseFilter)
  private
    FHue: Single;
  public
    property Hue: Single read FHue write SetHue;
    constructor Create(AOwner: TComponent = nil); override;
    function GetOutput: TBitmap; override;
  end;

  TContrastFilter = class(TBaseFilter)
  private
    FContrast, BBrightness: Single;
  public
    property Contrast: Single read FContrast write SetContrast;
    property Brightness: Single read BBrightness write SetBrightness;
    constructor Create(AOwner: TComponent = nil); override;
    function GetOutput: TBitmap; override;
  end;

// Реализация классов

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

Заключение

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

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

Вопрос пользователя Craig касается модификации фильтра цветовых оттенков для работы с насыщенностью и светлотой в модели HSL, с предложенным решением использовать свойство InputFilter для последовательного применения фильтров.


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-03-14 09:12:45/0.0034339427947998/0