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