Modos blend


A continuación tienen una descripción de diferentes modos blend.



Los parámetros a y b son bytes (desde 0 a 255) debido a que las imágenes son almacenadas de esta forma. El valor devuelto es 1 byte. Recordar que para imágenes RGB se necesita procesar el color de cada canal.




por ejemplo si ponemos:

result := (a * b) SHR 8;

si la imagen es RGB habría que hacer


result.red := (a.red * b.red) SHR 8;

result.green := (a.green * b.green) SHR 8;

result.blue := (a.blue * b.blue) SHR 8;



Relación de modos:



Media





result := (a+b) SHR 1;










Multiplicador:


result := (a*b) SHR 8;





Screen:


result := 255 - ((255-a) * (255-b) SHR 8);





Oscuridad:


if a < b then

  result := a

else

  result := b;





Luminosidad:


if a > b then

  result := a

else

  result := b;





Diferencial:


result := abs(a-b);





Overlay:


if a < 128 then

  result := (a*b) SHR 7

else

  result := 255 - ((255-a) * (255-b) SHR 7);





Hard Light:


if b < 128 then

  result := (a*b) SHR 7

else

  result := 255 - ((255-b) * (255-a) SHR 7);





Soft light:


if b < 128 then

  result := a - (128-b) * (16384-sqr(128-a)) SHR 15

else

  result := ???;





Dodge:


if b = 255 then

  result := 255

else begin

  c := (a SHL 8) DIV (255-b);

  if c > 255 then result := 255 else result := c;

end;





Color Burn:


if b = 0 then

  result := 0

else begin

  c := 255 - (((255-a) SHL 8) DIV b);

  if c < 0 then result := 0 else result := c;

end;





Inverse color burn:


if a = 0 then

  result := 0

else begin

  c := 255 - (((255-b) SHL 8) DIV a);

  if c < 0 then result := 0 else result := c;

end;





Soft burn:


if a+b < 256 then begin

  if a = 255 then

    Result := 255

  else begin

    c := (b SHL 7) DIV (255-a);

    if c > 255 then Result := 255 else Result := c;

  end;

end

else begin

  // b cannot be zero here

  c := 255-(((255-a) SHL 7) DIV b);

  if c < 0 then Result := 0 else Result := c;

end;





Quadratic:


if b = 255 then

  result := 255

else begin

  c := a*a DIV (255-b);

  if c > 255 then result := 255 else result := c;

end;





Additive:


c := a+b;

if c > 255 then result := 255 else result := c;





Subtractive:


c := a+b-256;

if c < 0 then result := 0 else result := c;





Stamp:


c := a + 2*b - 256;

if c < 0 then

  result := 0

else if c > 255 then

  result := 255

else

  result := c;





Interpolación:


// for i := 0 to 255 do CosineTab[i] := Round(64-Cos(i*Pi/255)*64);

c := CosineTab[b] + CosineTab[a];

if c > 255 then result := 255 else result := c;





Opacidad o transparencia:

Se introduce el factor de opacidad variable llamado "o"



Definición de opacidad y transparencia:

fopacidad(a,b,o) = o * f(a,b) + (1 - o) * a

Transparencia t = (1 - o), so

ftransparencia(a,b,t) = (1 - t) * f(a,b) + t * a



La función será:
result := a + (f(a,b)-a) * o;
























No hay comentarios:

Publicar un comentario

Simulación del movimiento de los electrones en un campo electrico

Espectacular simulación realizada con OpenGL del movimiento de los electrones cuando atraviesan un campo eléctrico. Como muestra la image...