Kolor do skali szarości

0

Witam, chciałbym zapytać czy przypadkiem nie ma ktoś jakiejs procedury ktora by stopniowo zmieniała kolorowy obrazek w obrazek w skali szarości i odwrotnie.

Za pomoc z gory thx :)

0

he he znajome pytanie

Function RGBToLightness(const R, G, B: Byte):Integer;
begin
  Result:=(MinIntValue([R, G, B])+MaxIntValue([R, G, B])) div 2;
end;

masz kodzik który dostałem od DetoX`a

0

you have prolems i have solution! Pick one that fits your needz:

Function RGBToSaturation(const R, G, B: Byte):Byte;
begin
	if MaxIntValue([R, G, B])=0 then
		Result:=0
	else
		Result:=Round(((MaxIntValue([R, G, B])-MinIntValue([R, G, B]))/MaxIntValue([R, G, B]))*255);
end;

Function RGBToLightness(const R, G, B: Byte):Integer;
begin
	Result:=(MinIntValue([R, G, B])+MaxIntValue([R, G, B])) div 2;
end;

Function RGBToIntensity(const R, G, B: Byte):Integer;
begin
	Result:=(R+G+B) div 3;
end;

Procedure RGBToAvgRGB(var R, G, B: Byte; Pass: TAvgPass);
var
	Red, Red2, Green, Green2, Blue, Blue2: Real;
	I: Byte;
begin
	Red2:=(R+((R+G+B)/3))/2;
	Green2:=(G+((R+G+B)/3))/2;
	Blue2:=(B+((R+G+B)/3))/2;
	Red:=Red2;
	Green:=Green2;
	Blue:=Blue2;
	if Pass>1 then
		for I:=2 to Pass do
			begin
				Red2:=(Red+((Red+Green+Blue)/3))/2;
				Green2:=(Green+((Red+Green+Blue)/3))/2;
				Blue2:=(Blue+((Red+Green+Blue)/3))/2;
				Red:=Red2;
				Green:=Green2;
				Blue:=Blue2;
			end;
	R:=Round(Red2);
	G:=Round(Green2);
	B:=Round(Blue2);
end;

Function RGBToYOfYIQ(const R, G, B: Byte): Byte;
begin
	Result:=Byte(Integer(77*R+150*G+29*B) div 256);
end;

function RGBToMaxV(const R, G, B: Byte): Byte;
begin
	Result:=MaxIntValue([R, G, B]);
end;

function RGBToMinV(const R, G, B: Byte): Byte;
begin
	Result:=MinIntValue([R, G, B]);
end;

//Function Bound is used interially by RGB->LightnessRGB and RGB->ContrastRGB
Function Bound(Min, Max: Byte; Value: Integer): Byte;
begin
	if Value<Min then
		Result:=Min
	else
		If Value>Max then
			Result:=Max
		else
			Result:=Value;
end;

function RGBToAvg(const R, G, B: Byte; AvgOp: TAvgOp): Byte;
begin
	case AvgOp of
		aoArithmetic:	Result:=Round((R+G+B)/3);
		aoGeometric:	Result:=Round(Power(R*G*B, 1/3));
		aoHarmonic:		Result:=Bound(0, 255, Round(3/((1/(R+1))+(1/(G+1))+(1/(B+1))))-1);
		aoSquare:			Result:=Round(Power(((R*R)+(G*G)+(B*B)/3), 1/2))
	else
		Result:=Round((R+G+B)/3);
	end;
end;

i jest jeszcze desaturacja, ale to nie tu...

ps. Beldzio: Kodzik, który dostałeś od detoxa został napisany przeze mnie...

Co do tego stopniowego zamieniania to masz 2 sposoby:

1.Użyć RGBToAvgRGB z pass na 1 (po ośmiu obrazek jest kompletnie w skali szarości) i tak używając 9 obrazków i animując między nimi masz cool efekt przejścia między nimi.

  1. Zrobić 2 obrazki: orginał i wyszażały dowoną metodą, a następnie przenikając między nimi użyskasz zajefajny efekt.

(jak bedziesz chciał do obu sposobów mogę dać gotowce)

1 użytkowników online, w tym zalogowanych: 0, gości: 1