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