saludos!
mira colega, anteriormente mencionas:
Cita:
...Para "mezclar" dos pixeles debes promediar cada R, G y B...
|
y se me ha ocurrido una idea matemáticamente para promediar los canales R, G y B entonces, la idea consiste en lo siguiente, por cada canal, R y R', G y G', B y B', suponiendo que:
Cita:
R = Red fuente;
G = Green fuente;
B = Blue fuente
y
R' = Red destino;
G' = Green destino;
B' = Blue destino;
|
calculamos la diferencia entre el canal destino y el original (ya que necesito saber cuanto le falta a uno para llegar a otro), por ejemplo: R' - R; a esta diferencia le hallamos el X% que representaría el valor del Alpha de 0 a 100, y le adicionamos al valor R este X%:
programáticamente sería asi, una función:
Código Delphi
[-]
function GetNewChanel(X1, X2, Alpha: Byte): Byte;
var
Diff: Integer;
Percent: Real;
nX: Byte;
begin
Diff := X2 - X1;
Percent := (Diff * Alpha) / 100;
nX := X1;
nX := nX + Trunc(Percent);
Result := nX;
end;
ahora, esta implementación da como resultado el promedio dado por Alpha entre dos canales, y esta otra función para mezclar todos los canales de un área:
Código Delphi
[-]
type TPercent = 0..100;
type TArea = record
Left, Top, Width, Height: Integer;
end;
function Area(aLeft, aTop, aWidth, aHeight: Integer): TArea;
begin
Result.Left := aLeft; Result.Top := aTop;
Result.Width := aWidth; Result.Height := aHeight;
end;
procedure ABlendArea(pCanvas1, pCanvas2: TCanvas; pArea: TArea; pAlpha: TPercent; var pCanvasDest: TCanvas);
var
X, Y: Integer;
R, G, B, _R, _G, _B, newR, newG, newB: Byte;
begin
Y := pArea.Top;
while Y <= pArea.Height do
begin
for X := pArea.Left to pArea.Width do
begin
R := GetRValue(pCanvas1.Pixels[X, Y]);
G := GetGValue(pCanvas1.Pixels[X, Y]);
B := GetBValue(pCanvas1.Pixels[X, Y]);
_R := GetRValue(pCanvas2.Pixels[X, Y]);
_G := GetGValue(pCanvas2.Pixels[X, Y]);
_B := GetBValue(pCanvas2.Pixels[X, Y]);
newR := GetNewChanel(R, _R, pAlpha);
newG := GetNewChanel(G, _G, pAlpha);
newB := GetNewChanel(B, _B, pAlpha);
pCanvasDest.Pixels[X, Y] := RGB(newR, newG, newB);
end;
Inc(Y);
end;
end;
sin embargo, necesito la ayuda de ustedes para que me ayuden a optimizar el código, ¿de que forma puedo hacer que funcione más rápido?
mil gracias de antemano!
saludos!
aeff!