¿Por qué la quemadura de color no afecta a un canal blanco?

Estoy experimentando un comportamiento inesperado con el modo de fusión de subexposición de color en Adobe Photoshop CS 5 (y CS 6).

Mi comprensión del modo de fusión es la siguiente ( https://helpx.adobe.com/photoshop/using/blending-modes.html ):

Color Burn : Mira la información de color en cada canal y oscurece el color base para reflejar el color de mezcla al aumentar el contraste entre los dos. La mezcla con blanco no produce ningún cambio.

Tengo la siguiente configuración:

  • Capa superior, completamente negra (n.º 000000), configurada en el modo de fusión Color Burn
  • Capa inferior, completamente blanca (#FFFFFF)

Mi resultado esperado es obtener un color completamente negro (#000000). Mi resultado real es un color completamente blanco (#FFFFFF).

Sin embargo, cuando cambio la capa inferior ligeramente, por ejemplo, a un valor casi blanco como #FEFFFF (254, 255, 255 en RGB), obtengo el resultado esperado de un canal completamente eliminado (#00FFFF).

Cuando la documentación dice blending with white produces no change, ¿espero que eso signifique la capa superior (es decir, la capa de mezcla)?

¿Por qué este modo de fusión no está "habilitado" cuando un canal en la capa base es completamente blanco?

La siguiente imagen muestra los resultados ejemplificados (en CS5):

Mezcla de quemadura de color cuando la capa superior es completamente negra y la capa base es completamente blanca

Mezcla de quemadura de color cuando la capa superior es completamente negra y la capa base es casi blanca


NOTA: Curiosamente, este mismo problema ocurre con la sobreexposición de color (si invierte todas las referencias de blanco a negro y viceversa. Cada vez que un canal en la capa base de sobreexposición de color está ligeramente por encima de 0, se activa el modo de fusión.


Editar

Esto también sucede si la capa superior es diferente de cero, por ejemplo, #040404.

De acuerdo con los algoritmos disponibles que he visto en línea, el caso de la esquina es solo cuando la capa superior es totalmente negra, pero estos algoritmos usan la capa superior (y no la capa inferior) como resultado.

Ejemplo:

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;

Donde a es la capa base (capa inferior) y b es la capa de mezcla (capa superior).

(Consulte https://stackoverflow.com/questions/5919663/how-does-photoshop-blend-two-images-together o http://www.pegtop.net/delphi/articles/blendmodes/burn.htm )

Dado que se experimenta el mismo comportamiento cuando la capa superior es diferente de cero, parece que PS tiene un caso especial para un valor de canal base de 255. Esto probablemente se deba a una decisión arbitraria de Adobe que no se refleja en otros algoritmos.

En mi humilde opinión, esta es una buena pregunta, pero tiene algunos votos cerrados porque es (y era más) un poco confuso. Parece que nos olvidamos de darle la bienvenida en primer lugar. Bienvenido a GD.SE, estamos contentos de tenerlo como miembro... Ahora, hecho eso.

Respuestas (2)

La división por cero no está definida. Dejar la imagen intacta es la única solución posible. Consulte wikipedia sobre los modos de fusión. Esto es un poco problemático en algunos casos, pero el uso de la quemadura de negro puro no es realmente significativo de todos modos. Usa multiplicar.

Dodge se quema en reversa. Así que presumiblemente querían que tuviera las mismas restricciones de esquina.

Comentarios del formulario de aclaración : La elección es arbitraria, dado que la división por cero no está definida.

Esto también sucede si la capa superior es diferente de cero, por ejemplo, #040404. De acuerdo con los algoritmos disponibles que he visto en línea, el caso de la esquina es solo cuando la capa superior es totalmente negra, pero estos algoritmos usan la capa superior (y no la capa inferior) como resultado. (Consulte stackoverflow.com/questions/5919663/… o pegtop.net/delphi/articles/blendmodes/burn.htm ) Dado que se experimenta el mismo comportamiento cuando la capa superior es diferente de cero, parece que PS tiene un caso especial para un canal base completamente blanco?
@Gedde Adobe hace muchas cosas raras. incluso su gamma correcta es sutilmente incorrecta y a nadie le importa. Pero sí, eso es lo que sucede cuando los desarrolladores se encuentran con una situación en la que se impone una elección arbitraria. A la mitad de los clientes no les gusta porque piensan que deberías haber elegido la otra opción... OTOH, entonces si hubieras hecho lo contrario, tendrías a la otra mitad en armas.
@Gedde puede evitar este problema ajustando las opciones de alter layar para que la salida de color de la capa se recorte en 1 pr 254 para que no haya 0 o 255 disponibles.
Ok, parece que esto es solo una decisión arbitraria de Adobe, como dices en tu primer comentario. Gracias por la solución también.
No marcaré esto como una respuesta, porque la respuesta dice "La división por cero no está definida", sin embargo, el problema real no es un caso de esquina de División por cero, sino un caso de esquina cada vez que el canal inferior es 255 (que no debería ser un caso de esquina, según tengo entendido). Siempre que alguien pueda explicar por qué el caso de la esquina de 255 para el canal inferior detiene el funcionamiento del modo de fusión de color, entonces otorgaré esa respuesta como aceptada.
Porque quemar es división por canal invertido a continuación. La inversión de 255 es 0. De todos modos, no me importa (es amable de tu parte ayudar a aclarar las preguntas). Podría editar esto para aclarar más tarde, pero ahora realmente tengo que ir a recoger a los niños.

Es básicamente un detalle de implementación.

Según las pruebas, parece que Adobe ha agregado una condición adicional al algoritmo normal [1] para la quemadura de color.

El algoritmo normal es:

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;

donde a es la capa superior (capa de mezcla) y b es la capa inferior (la capa base).

Sin embargo, la implementación de Adobe parece ser:

// Start of extra test
if a = 255 then
  result := 255
// End of extra test
else 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;

Note la prueba adicional al principio. Esto probablemente se agregue porque devolverá los resultados más consistentes siempre que la capa base sea completamente blanca. Todas las demás capas superiores que no sean completamente negras devolverán el blanco y, por lo tanto, han decidido devolver el blanco también cuando la capa superior sea completamente negra (donde es específico de la implementación qué devolver).

[1] = http://www.pegtop.net/delphi/articles/blendmodes/burn.htm