А в чем именно затруднения?
Доступ к пикселям картинки можно осуществить через канву, вот пример:
procedure SetMaskColor(AImage: TdbImage; AColor: TColor);
// раскрасить картинку-маску в нужный цвет
// маска служит для создания круглой виньетки.
var
x: integer;
y: integer;
begin
for y := 0 to AImage.Height - 1 do
for x := 0 to AImage.Width - 1 do
begin
if AImage.Canvas.Pixels(x, y) <> clWhite then
AImage.Canvas.Pixels(x, y) := AColor
end;
end;
Преобразование цвета в компоненты тоже видел на форуме. Обратное преобразование - встроенная функция RGB();
Вот пример из проекта с форума:
procedure GenerYarkost(Color: TColor); //Генерация шкалы яркости для выбранного оттенка
var
j: Integer; //счётчики
r, g, b: real;//RGB
begin
b := Color div $10000;
g := (Color mod $10000) div $100;
r := Color mod $100;
frmCol.Caption := 'RGB: R='+floattostr(r)+' G='+floattostr(g)+' B='+floattostr(b)+' HEX: '+TColorToHex(Color);
StepR:=(256-r)/256; //определение шага для красного
StepG:=(256-g)/256; //определение шага для зелёного
StepB:=(256-b)/256; //определение шага для синего
for j:=255 downto 0 do
begin
r:=r+StepR; //меняем оттенок красного
g:=g+StepG; //меняем оттенок зеленого
b:=b+StepB; //меняем оттенок синего
if r>255 then r:=255; //проверяем чтобы не превысил 255
if g>255 then g:=255;
if b>255 then b:=255;
imCol3.Canvas.Pen.Color:=RGB(round(r), round(g), round(b));
imCol3.Canvas.MoveTo(0,j);
imCol3.Canvas.LineTo(40,j);
end;
end;
Осталось выбрать формулу для перевода цвета в черно-белое изображение, например вот такую:
C = 0.2989 * R + 0.5870 * G + 0.1140 * B
Визуальное программирование:
блог и
телеграм-канал.