Transparencia a RGB + Alpha no multiplicado previamente

16

Tengo una capa transparente en Photoshop CS5 (por lo que, internamente, probablemente se almacena como un componente RGB no multiplicado más un componente alfa por píxel).

Ahora quiero transformar esto en una capa opaca (solo RGB no premultiplicado) + una máscara alfa. el resultado debería verse igual que el original.

No puedo simplemente subyacer la capa transparente con negro, tomar la selección de ella como una máscara y fusionar las capas, porque esto daría como resultado que el alfa se premultiplique en los valores RGB.

Espero que entiendas el problema y puedas darme una solución.

Como explicación alternativa: quiero el proceso INVERSO de esto:

  1. crea una nueva capa y pega en cualquier imagen
  2. crear una máscara con un degradado de blanco a negro
  3. aplicar la máscara de capa

Explicación de imágenes:

Estado A: ingrese la descripción de la imagen aquí

Estado B: ingrese la descripción de la imagen aquí


IMPORTANTE: la capa es solo para este ejemplo completamente roja constante, pero podría pensar en cualquier imagen arbitraria en lugar de la constante roja. Entonces, para pasar del estado A al estado B, uno simplemente tiene que aplicar la máscara de capa.

Quiero saber cómo ir del Estado B al Estado A.

Estera
fuente
Me pregunto si algún tipo de complemento de enmascaramiento podría ayudar aquí. La información de opacidad existe, es solo cuestión de cómo obtenerla. Obtener información a nivel de píxel no existe en las API de secuencias de comandos (al menos en Applescript, pero todos los lenguajes compatibles parecen alinearse con lo que he visto).
Philip Regan

Respuestas:

6

Entiendo completamente tu dolor. Aquí está mi solución :)
Extraer alfa como acción de máscara
Esto es lo que hace:

ingrese la descripción de la imagen aquí Editar:
ingrese la descripción de la imagen aquí
espero que esto ayude :)

Miró
fuente
Whoa, genial ... Seguro requiere el uso de acciones para que sea un proceso soportable.
Ars Magika
5

¡Incorrecto! ¡Todo mal!

Me engañé a mí mismo, y a ti también en el proceso: lo que creé es de hecho una imagen premultiplicada, no premultiplicada con negro sino con blanco. Dejo esta respuesta para que otros la desarrollen.


Logré hacerlo así:

  1. Extraiga canales RGBA verdaderos de la imagen
  2. Úsalos para construir una nueva imagen

Y así es como lo hice:

imagen de prueba

Esta es la imagen de prueba que utilicé. La vista del canal en PS se ve así:

canales

Al seleccionar los canales individuales, los copié en capas individuales, luego los aplané con un fondo blanco para recibir un mapa en blanco y negro como se muestra aquí:

bw-map

También extraje la transparencia de la imagen original en una capa haciendo clic con el comando en la miniatura de la capa y llenando una nueva capa con la selección.

Luego creé una nueva imagen con las mismas dimensiones y sin transparencia. Luego pegué las capas RGB que había creado en los canales correspondientes en la nueva imagen:

nuevos canales de imagen

En el último paso, 'desenvolví' la capa haciendo doble clic y creé una máscara de capa usando la capa alfa de la imagen original, lo que resultó en esto:

máscara de capa


Como se indicó anteriormente, esto no crea una imagen no premultiplicada, ya que mi ejemplo tendría que verse así para no premultiplicarse:

versión correcta

¿Alguien es más inteligente que yo y puede crear esto? Creo que sin una secuencia de comandos avanzada basada en píxeles, esto no es posible en Photoshop.

Florian Dobler
fuente
5

Ok, creé un filtro simple de pixelBender que se puede usar con el complemento de Photoshop PixelBender (http://labs.adobe.com/downloads/pixelbenderplugin.html) para eliminar la transparencia de una capa. aquí está: http://neo.cycovery.com/removeTransparency.pbk

Estera
fuente
2

Según las respuestas dadas y sus comentarios, la respuesta corta es: no puede hacer lo que quiere. Una vez que aplica la máscara, la capa se renderiza y los datos de imagen que no se ven se desechan.

EDITAR:

Hice algunos archivos png de muestra y luego usé php para manipularlos (código fuente a continuación).

Si creo un png con transparencia aleatoria y lo guardo mientras la capa tiene una máscara, las áreas 100% claras (como las de una herramienta de recuadro) se muestran en blanco si el soporte alfa está habilitado o no. Los degradados que contienen una cantidad de 100% de borrado no se muestran con alfa deshabilitado.

Si aplico la máscara de capa (permanentemente) y luego creo el png, entonces php muestra la imagen original si alpha está deshabilitado.

Entonces, una posible solución para esto es encontrar un paquete de software que no sea compatible con PNG alfa y volver a guardarlo desde allí. En cuanto a la recuperación de la máscara original, aún no la he visto.

Ambos ejemplos de código son prueba de concepto y LENTO.

<?php

$im = imagecreatefrompng('./images/alphatest_nolayer.png');
$enable_alpha = 0;  //set to 0 to disable aplha

if ($enable_alpha) {
    imagealphablending($im, false);
    imagesavealpha($im, true);
}

header('Content-Type: image/png');
imagepng($im);

imagedestroy($im);

?>

Para extraer el alfa (nota: php tiene una limitación GD de alfa de nivel 128, en lugar de 256), por lo que se pierde algo de precisión. El alfa se puede extender a 256 usando la herramienta de niveles)

<?php

$im = imagecreatefrompng('./images/alphatest_nolayer.png');
$w = imagesx($im);
$h = imagesy($im);

$om = imagecreatetruecolor($w,$h);

for ($x = 0; $x < $w; $x++) {
    for ($y = 0; $y < $h; $y++) {
        $rgb = imagecolorat($im, $x, $y);
        $colors = imagecolorsforindex($im,  $rgb);

        $orgb = imagecolorallocate($om,$colors['alpha'],$colors['alpha'],$colors['alpha']);
        imagesetpixel($om,$x,$y,$orgb);
    }
}

header('Content-Type: image/png');
imagepng($om);

imagedestroy($om);
imagedestroy($im);

?>
Horacio
fuente
pero los datos aún están ahí. Es la parte RGB de los datos de píxeles RGBA. debe haber una manera de extraerlo
Mat
1
¿Por qué no proporciona un archivo de ejemplo del mundo real? En su pregunta, muestra claramente una sola capa con área transparente y sin máscara, ni indicación de un canal alfa.
Horacio
.png tiene un color de paleta predefinido para un negro 100% transparente, que se usará de manera propagable (por Photoshop) siempre que haya 100% de transparencia solo para ahorrar espacio en el disco.
Ars Magika
No estoy seguro de que esto realmente responda la pregunta, parece ser específico para el manejo de PNG.
e100
2

Descubrí cómo hacerlo en GIMP , puede que no sea PhotoShop, pero al menos hará lo que pides. (Como lo interpreto de todos modos;))

  • Abre la imagen en GIMP.
  • Haga clic con el botón derecho del mouse en la capa en el cuadro de capas
  • Seleccione " agregar máscara de capa " en el menú contextual
  • En el siguiente menú, seleccione " transferir capas del canal alfa " y haga clic en el botón " Agregar "

En este punto, te queda una imagen con una máscara de canal alfa.

Puedes ir un paso más allá:

  • Haga clic derecho en la máscara de capa y seleccione " Eliminar máscara de capa "
  • Ahora te queda la imagen sin la máscara alfa.

También hay un clip de YouTube sobre cómo hacerlo.

Roberto De Vivo
fuente
Roberto: Sí, encontraste la respuesta. ¡Eso es exactamente lo que queremos, y es gratis! Usaré el video que publicaste como respuesta para cualquier otra persona que pregunte lo mismo (hasta ahora solo es posible duplicando infinitamente la capa en PS)
1

Esto parece alucinantemente complejo. Si entiendo la pregunta original y sus diversas aclaraciones correctamente, el problema es tomar cualquier imagen arbitraria que contenga transparencia y hacerla completamente opaca, luego aplicar los valores alfa originales como una máscara para recrear la apariencia original.

Si esta es la pregunta, es una respuesta muy simple, aunque un poco tediosa.

  1. Copie la capa 10 veces. La transparencia se "completará" en la imagen compuesta.

  2. Combine todas las copias (pero NO la capa original , que necesitará para los últimos pasos).

  3. Repita los pasos 1 y 2 con la capa fusionada, luego vuelva a hacerlo. En este punto, todos los píxeles que eran menos del 100% transparentes ahora son 100% opacos (si hay algunas dispersiones, simplemente repita el proceso hasta que no haya ninguna). Esa es tanta información de imagen como es posible recuperar.

  4. Ctl / Cmd-Haga clic en la miniatura de la capa original para cargar su transparencia.

  5. Con la nueva capa opaca seleccionada, haga clic en el icono de máscara de capa en el Panel de capas.

Alan Gilbertson
fuente
0

Ok, esto es bastante simple (tienes que ignorar las hormigas que marchan)

Haga una nueva capa y llénela completamente con el color que esté usando (si el muestreo lo toma desde el punto muerto de la primera imagen)

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Luego tome su primera imagen y CTRL + Haga clic en la miniatura de la capa, debería ver alguna versión de esto: ingrese la descripción de la imagen aquí

Como dije antes: ignore a las hormigas que marchan, el plumaje entra en vigencia automáticamente en CS5.

Luego, asegúrese de tener seleccionada la capa rellena y haga clic en el botón de máscara:

ingrese la descripción de la imagen aquí

Luego solo oculta la capa inferior y deberías terminar, con el efecto exacto que estás buscando :)

ingrese la descripción de la imagen aquí

Y así es como aplicar ingeniería inversa a una máscara aplicada en CS5. La función de selección de capa CS5 es bastante avanzada, por lo que la mayoría de las veces simplemente ignora a las hormigas marchantes, ya que no muestran correctamente ningún tipo de plumaje que continuará con la selección :)

Espero que funcione para usted.

Kyle
fuente
gracias por su respuesta, pero esto no es lo que estoy buscando, como se explicó, ¡el rojo constante es solo para este ejemplo! puede ser CUALQUIER imagen (no solo un color de relleno constante) y, por supuesto, no tengo disponible la imagen original no transparente
Mat
Bueno, deberías publicar tu imagen en tu pregunta. Si publica un relleno constante, responderemos en función de un relleno constante. Sin embargo, intente utilizar las técnicas aquí, la selección de CS5 es muy avanzada, puede sorprenderlo. Me hizo.
Kyle
¡por supuesto que sé sobre esas técnicas de selección! el problema en cuestión es cómo acceder a la parte RGB solamente de una capa transparente
Mat
Sobre las capas hay tres pestañas, haga clic en canales. Ahí tienes la máscara roja, verde, azul y de capa. Tal vez esto es lo que buscas?
Kyle
pero una capa como en neo.cycovery.com/alpha_prob2.jpg no muestra un canal alfa; en cambio, solo muestra los canales RG y B con la transparencia ya aplicada
Mat
0

Lo que desea hacer se realiza fácilmente mediante un complemento, como el complemento "Eliminar transparencia" de Photofreebies. Primero, haga clic en la capa para seleccionar los píxeles transparentes, luego guarde esta información de transparencia en un nuevo canal para mantenerla. Luego aplica el filtro "Eliminar transparencia" y ve que los píxeles 'ocultos' en su capa se vuelven opacos (bastante interesante para ver cómo Photoshop diseña sus píxeles 100% transparentes, por cierto). Realmente deseo durante años que esto se haya integrado en Photoshop de forma nativa, pero por desgracia, demasiado avanzado, supongo.

Desafortunadamente, no puedo encontrar una versión compatible con Photoshop CS6 de dicho complemento para Mac, así que estoy atascado en este momento. GraphicConverter también puede hacerlo (eliminar el canal alfa).

zmippie
fuente
0

Aquí está la respuesta:

  1. Haz una capa con las cosas que deseas en la imagen.

  2. Haga una selección para el canal alfa deseado.

  3. Haga la selección una "máscara de capa" para la capa de imagen.

  4. Haga clic derecho en la máscara de capa y "Aplicar máscara de capa".

Ahora comienza la magia:

  1. Vaya a "Capa", y en la parte inferior: "Estera", luego elija "Eliminar mate negro".

¡De nada!

Factura electrica
fuente