Trasparenza verso RGB + Alpha non replicato


16

Ho un livello trasparente in Photoshop CS5 (quindi internamente, molto probabilmente è memorizzato come componente RGB non moltiplicato più un componente alfa per pixel).

Ora voglio trasformarlo in un livello opaco (solo RGB non moltiplicato) + una maschera alfa. il risultato dovrebbe essere uguale all'originale.

Non posso semplicemente sostenere il livello trasparente con il nero, prendere la selezione da esso come una maschera e unire i livelli, perché ciò comporterebbe la premoltiplicazione dell'alfa nei valori RGB.

Spero che tu capisca il problema e possa darmi una soluzione.

Come spiegazione alternativa: voglio il processo INVERSO di questo:

  1. crea un nuovo livello e incolla qualsiasi immagine
  2. crea una maschera con una sfumatura da bianco a nero
  3. applica la maschera di livello

Immagini esplicative:

Stato A: inserisci qui la descrizione dell'immagine

Stato B: inserisci qui la descrizione dell'immagine


IMPORTANTE: il livello è solo per questo esempio rosso costantemente costante, ma potresti pensare a qualsiasi immagine arbitraria anziché al rosso costante. quindi - per passare dallo stato A allo stato B, è sufficiente applicare la maschera di livello.

Voglio sapere come andare dallo stato B allo stato A.


Mi chiedo se un qualche tipo di plug-in di mascheramento possa essere d'aiuto qui. Le informazioni sull'opacità esistono, è solo una questione di come ottenerle. Ottenere informazioni a livello di pixel non esiste nelle API di scripting (almeno in Applescript, ma tutte le lingue supportate sembrano allinearsi rispetto a ciò che ho visto).
Philip Regan,

Risposte:



5

Sbagliato! Tutto sbagliato!

Mi sono ingannato, e anche tu nel processo: ciò che ho creato è davvero un'immagine premoltiplicata - non premoltiplicata per il nero ma per il bianco. Lascio a questa risposta la possibilità per gli altri di costruirla.


Sono riuscito a farlo in questo modo:

  1. Estrai i veri canali RGBA dall'immagine
  2. Usali per creare una nuova immagine

Ed ecco come l'ho fatto:

immagine di prova

Questa è l'immagine di prova che ho usato. La visualizzazione del canale in PS è simile alla seguente:

canali

Selezionando i singoli canali li ho copiati in singoli livelli, quindi li ho appiattiti con uno sfondo bianco per ricevere una mappa in bianco e nero come mostrato qui:

bw-map

Ho anche estratto la trasparenza dell'immagine originale in un livello facendo clic sui comandi sulla miniatura del livello e riempiendo un nuovo livello con la selezione.

Quindi ho creato una nuova immagine con le stesse dimensioni e senza trasparenza. Ho quindi incollato i livelli RGB che avevo creato nei canali corrispondenti nella nuova immagine:

nuovi canali di immagini

Nell'ultimo passaggio, ho 'appiattito' il livello facendo doppio clic e ho creato una maschera di livello usando il livello alfa dall'immagine originale, risultando in questo:

maschera di livello


Come detto sopra, questo non crea un'immagine non premoltiplicata, poiché il mio esempio dovrebbe apparire come questo per essere non premoltiplicato:

versione corretta

Qualcuno è più intelligente di me e può crearlo? Ritengo che senza script avanzati basati su pixel, ciò non sia possibile in Photoshop.



2

Sulla base delle risposte fornite e dei tuoi commenti, la risposta breve è: non puoi fare quello che vuoi. Una volta applicata la maschera, il livello viene renderizzato e i dati dell'immagine invisibili vengono eliminati.

MODIFICARE:

Ho creato alcuni file png di esempio e poi ho usato php per manipolarli (codice sorgente di seguito).

Se creo un png con trasparenza casuale e salvo mentre il livello ha una maschera, le aree chiare al 100% (come da uno strumento casella) mostrano come bianche se il supporto alfa è abilitato o meno. Le sfumature che contengono una certa quantità di chiaro al 100% non vengono visualizzate con l'alfa disabilitato.

Se applico la maschera di livello (in modo permanente) e quindi creo il png, allora php serve l'immagine originale se l'alfa è disabilitata.

Quindi una potenziale soluzione per questo è trovare un pacchetto software che non supporti l'alfa PNG e salvarlo da lì. Per quanto riguarda il recupero della maschera originale, non l'ho ancora visto.

Entrambi gli esempi di codice sono proof of concept e SLOW.

<?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);

?>

Per estrarre l'alfa (nota: php ha una limitazione GD di 128 livelli alpha, anziché 256), quindi una certa precisione viene persa. L'alfa può essere allungata a 256 utilizzando lo strumento Livelli)

<?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);

?>

ma i dati sono ancora lì. è la parte RGB dei dati pixel RGBA. deve esserci un modo per estrarlo
Mat

1
perché non fornisci un file di esempio reale? Nella tua domanda, mostri chiaramente un singolo livello con area trasparente e senza maschera, né indicazione di un canale alfa.
horatio

.png ha un colore della tavolozza predefinito per il nero trasparente al 100%, che verrà probabilmente utilizzato (da Photoshop) ogni volta che c'è una trasparenza del 100% solo per risparmiare spazio su disco.
Ars Magika,

Non sono sicuro che questo risponda effettivamente alla domanda - sembra essere specifico per la gestione dei PNG.
e100,

2

Ho scoperto come farlo in GIMP potrebbe non essere PhotoShop ma almeno farà quello che chiedi. (Come lo interpreto comunque;))

  • Apri l'immagine in GIMP.
  • Fai clic con il pulsante destro del mouse sul livello nella casella dei livelli
  • Seleziona " aggiungi maschera di livello " dal menu contestuale
  • Nel menu seguente selezionare " trasferisci livelli canale alfa " e fare clic sul pulsante " Aggiungi "

A questo punto ti rimane un'immagine con una maschera del canale alfa.

Puoi fare un ulteriore passo avanti:

  • Fai clic con il tasto destro sulla maschera di livello e seleziona " elimina maschera di livello "
  • Ora ti rimane l'immagine senza la maschera alfa.

C'è anche una clip di YouTube su come farlo.


Roberto: Sì, hai trovato la risposta. Questo è esattamente quello che vogliamo ed è gratuito !! Userò il video che hai pubblicato come risposta per qualsiasi altra persona che lo chieda (fino ad ora possibile solo duplicando all'infinito il livello in PS)

1

Questo sembra incredibilmente complesso. Se capisco correttamente la domanda originale e i suoi vari chiarimenti, il problema è prendere un'immagine arbitraria contenente trasparenza e renderla completamente opaca, quindi applicare i valori alfa originali come maschera per ricreare l'aspetto originale.

Se questa è la domanda, è una risposta molto semplice, anche se un po 'noiosa.

  1. Copia il livello 10 volte. La trasparenza si "riempirà" nell'immagine composita.

  2. Unisci tutte le copie (ma NON il livello originale , di cui avrai bisogno per gli ultimi passaggi).

  3. Ripeti i passaggi 1 e 2 con il livello unito, quindi esegui nuovamente. A questo punto, tutti i pixel che erano trasparenti meno del 100% sono ora opachi al 100% (se ci sono alcuni randagi, basta ripetere il processo fino a quando non ce ne sono). Sono quante più informazioni sull'immagine che è possibile recuperare.

  4. Ctl / Cmd-Fai clic sulla miniatura del livello originale per caricarne la trasparenza.

  5. Con il nuovo livello opaco selezionato, fai clic sull'icona della maschera di livello nel pannello Livelli.


0

Ok, questo in realtà è piuttosto semplice (devi ignorare le formiche in marcia)

Crea un nuovo livello e riempilo interamente con qualsiasi colore tu stia usando (se il campionamento lo prende dal punto morto della prima immagine)

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Quindi prendi la tua prima immagine e CTRL + Fai clic sulla miniatura del livello, dovresti vedere una versione di questo: inserisci qui la descrizione dell'immagine

Come ho detto prima: ignora le formiche in marcia, il piumaggio entra in vigore automaticamente in CS5.

Quindi assicurati di aver selezionato il livello riempito e fai clic sul pulsante maschera:

inserisci qui la descrizione dell'immagine

Quindi nascondi il livello inferiore e dovresti farlo, con l'effetto esatto che stai cercando :)

inserisci qui la descrizione dell'immagine

Ed ecco come decodificare una maschera applicata in CS5. La funzione di selezione del livello CS5 è piuttosto avanzata, quindi la maggior parte delle volte ignora solo le formiche in marcia perché non mostrano correttamente alcun piumaggio che andrà avanti con la selezione :)

Spero che funzioni per te.


grazie per la tua risposta ma questo non è quello che sto cercando - come spiegato il rosso costante è solo per questo esempio! può essere QUALSIASI immagine (non solo un colore di riempimento costante) - e, naturalmente, non ho a disposizione l'immagine originale non trasparente
Mat

Bene, dovresti pubblicare la tua immagine nella tua domanda. Se pubblichi un riempimento costante, risponderemo in base a un riempimento costante. Cerca di utilizzare le tecniche qui, tuttavia, la selezione di CS5 è molto avanzata, potrebbe sorprenderti. Mi ha fatto
Kyle

ovviamente conosco quelle tecniche di selezione! il problema in questione è come accedere all'unica parte RGB di un livello trasparente
Mat

Sopra i livelli ci sono tre schede, canali di clic. Lì hai la maschera rossa, verde, blu e a strati. Forse questo è quello che cerchi?
Kyle

ma uno strato come in neo.cycovery.com/alpha_prob2.jpg non mostra un canale alfa - invece mostra solo i canali RG e B con la trasparenza già applicata
Mat

0

Quello che vuoi fare è fatto facilmente da un plugin, come il plugin "Rimuovi Trasparenza" di Photofreebies. Per prima cosa, fai clic sul livello per selezionare i pixel trasparenti, quindi salva queste informazioni sulla trasparenza in un nuovo canale per mantenerle. Quindi applichi il filtro "Rimuovi trasparenza" e vedi i pixel "nascosti" nel tuo livello diventare opachi (abbastanza interessante vedere come Photoshop layout i tuoi pixel trasparenti al 100% in BTW). Vorrei davvero che da anni questo fosse incorporato in Photoshop in modo nativo, ma purtroppo, troppo avanzato, credo.

Sfortunatamente, non riesco a trovare una versione compatibile con Photoshop CS6 di un tale plug-in per Mac, quindi sono bloccato in questo momento. Anche GraphicConverter può farlo (Rimuovi canale alfa).


0

Ecco la risposta:

  1. Crea un livello con le cose che vuoi nell'immagine.

  2. Effettuare una selezione per il canale alfa desiderato.

  3. Rendi la selezione una "maschera di livello" per il livello immagine.

  4. Fare clic con il tasto destro sulla maschera di livello e "Applica maschera di livello".

Ora inizia la magia:

  1. Vai su "Livello", e in fondo: "Opacizzazione", quindi scegli "Rimuovi nero opaco".

Prego!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.