Есть вот такой неказистый код ...
- Код: Выделить всё
// HSV+ -> RGB ( -1 =< (S,V) <=1 -360=<H<=360 )
procedure PlusHSV(Const Src: TBitmap;H,S,V : extended);
Type
RG=Record B,G,R : byte; end;
Arr=Array [0..1] of RG;
var
H0,S0,V0 : extended;
R0,G0,B0 : extended;
var
C:RG;
//PC:^RG;
w1,h1,x,y:integer;
Ps:^Arr;
Procedure TST(var T: extended);
begin
if (T>1) then T:=1;
If (T<0) then T:=0;
end;
begin
W1:=Src.Width ;
H1:=Src.height;
for Y:=0 to H1-1 do begin
Src.BeginUpdate(False);
Ps:=Src.scanline[y];
for X:=0 to W1-1 do
With Ps^[X] do begin
c:= Ps^[X];
Try
R0:=R/255; G0:=G/255; B0:=B/255;
RGB_to_HSV(R0,G0,B0 ,H0,S0,V0);
H0:=H0+H;S0:=S0+S;V0:=V0+V;
HSV_to_RGB(H0,S0,V0,R0,G0,B0);
TST(R0); c.R:=Lo(Round(r0*255 ) );
TST(G0); c.g:=Lo(Round(g0*255 ) );
TST(B0); c.b:=Lo(Round(b0*255 ) );
finally
Ps^[X]:=C;
end;
end;
Src.EndUpdate(False);
end;
end;
//R,G,B H,S,V - [0.0 - 1.0]
Procedure RGB_to_HSV(R,G,B : extended; var H,S,V : extended);
const undefined=359;
function max_of(Red,Green,Blue : extended) : extended;
var max : extended;
begin
if red>green then max:=red else max:=green;
if blue>max then max:=blue;
max_of:=max;
end;
function min_of(Red,Green,Blue : extended) : extended;
var min : extended;
begin
if red<green then min:=red else min:=green;
if blue<min then min:=blue;
min_of:=min;
end;
var Max_value, Min_value,diff,r_dist,g_dist,b_dist : extended;
begin
max_value:=max_of(R,G,B);
min_value:=min_of(R,G,B);
diff:=max_value-min_value;
V:=max_value;
if max_value<>0 then s:=(diff / max_value) else s:=0;
if s=0 then h:=undefined
else begin
r_dist:=(max_value-R) / diff;
g_dist:=(max_value-G) / diff;
b_dist:=(max_value-B) / diff;
if R=max_value
then H:=b_dist-g_dist
else if G=Max_value
then H:=2+r_dist-b_dist
else if B=max_value
then H:=4+g_dist-r_dist;
H:=H*60;
if H<0 then h:=h+360;
end;
end;
// HSV -> RGB ( 0=< (R,G,B,S,V) <=1 и 0=<H<=360 )
Procedure HSV_to_RGB(H,S,V : extended; var R,G,B : extended);
var f,p,q,t : extended ; i:integer;
begin
if S=0
then begin
R:=V;
G:=V;
B:=V;
end
else begin
if H=360 then H:=0;
H:=H/60;
I:=trunc(H); { the integer part of H }
f:=H-i;
p:=V*(1-S);
q:=V*(1-(S*f));
t:=V*(1-(S*(1-f)));
case i of
0: begin R:=V; G:=t; B:=p; end;
1: begin R:=q; G:=V; B:=p; end;
2: begin R:=p; G:=V; B:=t; end;
3: begin R:=p; G:=q; B:=V; end;
4: begin R:=t; G:=p; B:=V; end;
5: begin R:=V; G:=p; B:=q; end;
end;
end;
end;
..задача которого очень проста : пересчитать для каждого пикселя произвольной картинки RGB -> HSV прибавить/отнять дельту по HSV и вернуть обратно HSV -> RGB ...
Проще некуда ! Вроде работает но ... результат "болен ветрянкой" то есть сильно пятнист...
В редакторах и разных смотрелках картинок та же самая операция проходит нормально и гладко
(настройка тона, насыщенности и "светлоты"[гамма конкреция] ) ...
Вопрос: как добиться похожего результата ? И откуда взялись "пятна на солнце" ?
Зы
Извиняюсь вначале поспешил и PlusHSV влезла в старой "отладочной версии"...
Кстати интересно и то из за чего я возился с отладкой
Пишу так :
R0:=R/255; G0:=G/255; B0:=B/255;
RGB_to_HSV(R0,G0,B0 ,H0,S0,V0);
Работает ("не шатко не валко" но хоть не вылетает )...
А пишу так :
RGB_to_HSV(R/255, G/255,B/255,H0,S0,V0);
Начинаются разные "чудеса" ...
Зы Зы
Кстати набор конвертеров на ЯваСкриптах ...
https://raw.githubusercontent.com/e673/ ... convert.js