Tema: AlphaBlend
Ver Mensaje Individual
  #9  
Antiguo 30-11-2008
Avatar de aeff
aeff aeff is offline
Miembro
 
Registrado: oct 2006
Ubicación: Cuba, Guantánamo
Posts: 348
Reputación: 18
aeff Va camino a la fama
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!

Última edición por aeff fecha: 30-11-2008 a las 08:23:21.
Responder Con Cita