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