Transparence vers RGB + Alpha non multiplié


16

J'ai un calque transparent dans Photoshop CS5 (donc en interne, il est très probablement stocké en tant que composant RVB non multiplié plus un composant alpha par pixel).

Maintenant, je veux transformer cela en un calque opaque (juste RVB non multiplié) + un masque alpha. le résultat devrait ressembler à l'original.

Je ne peux pas simplement sous-tendre le calque transparent avec du noir, prendre la sélection comme masque et fusionner les calques, car cela entraînerait la prémultiplication de l'alpha dans les valeurs RVB.

J'espère que vous comprenez le problème et pouvez me donner une solution.

Comme explication alternative: je veux le processus inversé de ceci:

  1. créer un nouveau calque et coller dans n'importe quelle image
  2. créer un masque avec un dégradé de blanc à noir
  3. appliquer le masque de calque

Images explicatives:

État A: entrez la description de l'image ici

État B: entrez la description de l'image ici


IMPORTANT: le calque est juste pour cet exemple entièrement rouge constant - mais vous pourriez penser à n'importe quelle image arbitraire au lieu du rouge constant. donc - pour passer de l'état A à l'état B, il suffit d'appliquer le masque de calque.

Je veux savoir comment passer de l'État B à l'État A.


Je me demande si un type de plug-in de masquage pourrait aider ici. Les informations d'opacité existent, c'est juste une question de comment les obtenir. Obtenir des informations au niveau des pixels n'existe pas dans les API de script (au moins dans Applescript, mais toutes les langues prises en charge semblent s'aligner sur ce que j'ai vu).
Philip Regan

Réponses:



5

Faux! Tout faux!

Je me suis trompé, et vous aussi dans le processus: ce que j'ai créé est en effet une image prémultipliée - pas prémultipliée avec du noir mais avec du blanc. Je laisse cette réponse aux autres pour en tirer parti.


J'ai réussi à le faire comme ça:

  1. Extraire les vrais canaux RGBA de l'image
  2. Utilisez-les pour créer une nouvelle image

Et voici comment je l'ai fait:

tester l'image

Ceci est l'image de test que j'ai utilisée. La vue des chaînes dans PS ressemble à ceci:

canaux

En sélectionnant les canaux individuels, je les ai copiés dans des couches individuelles, puis les aplatis avec un fond blanc pour recevoir une carte en noir et blanc comme indiqué ici:

bw-map

J'ai également extrait la transparence de l'image d'origine dans un calque en cliquant sur la vignette du calque et en remplissant un nouveau calque avec la sélection.

J'ai ensuite créé une nouvelle image avec les mêmes dimensions et sans transparence. J'ai ensuite collé les calques RVB que j'avais créés dans les canaux correspondants dans la nouvelle image:

nouvelles chaînes d'images

Dans la dernière étape, j'ai `` aplati '' le calque en double-cliquant et créé un masque de calque en utilisant le calque alpha de l'image d'origine, ce qui se traduit par:

masque de calque


Comme indiqué ci-dessus, cela ne crée pas une image non prémultipliée, car mon exemple devrait ressembler à ceci pour être non prémultiplié:

version correcte

Quelqu'un est-il plus intelligent que moi et peut-il créer cela? Je pense que sans script avancé basé sur les pixels, cela n'est pas possible dans Photoshop.



2

Sur la base des réponses données et de vos commentaires, la réponse courte est: vous ne pouvez pas faire ce que vous voulez. Une fois le masque appliqué, le calque est rendu et les données d'image invisibles sont supprimées.

ÉDITER:

J'ai fait quelques exemples de fichiers png, puis utilisé php pour les manipuler (code source ci-dessous).

Si je crée un png avec une transparence aléatoire et que j'enregistre alors que le calque a un masque, les zones 100% claires (comme dans un outil de boîte) s'affichent en blanc si le support alpha est activé ou non. Les dégradés qui contiennent une certaine quantité de clair à 100% n'apparaissent pas avec l'alpha désactivé.

Si j'applique le masque de calque (de façon permanente) puis que je crée le png, alors php sert l'image d'origine si alpha est désactivé.

Une solution de contournement potentielle consiste donc à trouver un progiciel qui ne prend pas en charge l'alpha PNG et à le réenregistrer à partir de là. Quant à récupérer le masque d'origine, je ne l'ai pas encore examiné.

Les deux exemples de code sont la preuve de concept et 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);

?>

Pour extraire l'alpha (note: php a une limitation GD de 128 alpha de niveau, plutôt que 256), donc une certaine précision est perdue. L'alpha peut être étendu à 256 à l'aide de l'outil Niveaux)

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

?>

mais les données sont toujours là. c'est la partie RGB des données de pixel RGBA. il doit y avoir un moyen de l'extraire
Mat

1
pourquoi ne fournissez-vous pas un exemple de fichier réel? Dans votre question, vous montrez clairement un seul calque avec une zone transparente et sans masque, ni indication d'un canal alpha.
horatio

.png a une couleur de palette prédéfinie pour un noir 100% transparent, qui sera utilisé de manière appropriée (par Photoshop) chaque fois qu'il y aura une transparence de 100% juste pour économiser de l'espace disque.
Ars Magika

Je ne suis pas sûr que cela réponde réellement à la question - semble être spécifique à la gestion PNG.
e100

2

J'ai découvert comment le faire dans GIMP ce n'est peut-être pas PhotoShop mais au moins il fera ce que vous demandez. (Comme je l'interprète de toute façon;))

  • Ouvrez l'image dans GIMP.
  • Cliquez avec votre bouton droit , sur la couche dans la couche boîte
  • Sélectionnez " ajouter un masque de calque " dans le menu contextuel
  • Dans le menu suivant, sélectionnez " Transférer les couches canal alpha " et cliquez sur le bouton " Ajouter "

À ce stade, vous vous retrouvez avec une image avec un masque de canal alpha.

Vous pouvez aller encore plus loin:

  • Faites un clic droit sur le masque de calque et sélectionnez " Supprimer le masque de calque "
  • Vous êtes maintenant laissé avec l'image sans le masque alpha.

Il y a aussi un clip YouTube sur la façon de le faire.


Roberto: Oui, vous avez trouvé la réponse. C'est exactement ce que nous voulons, et c'est gratuit !! Je vais utiliser la vidéo que vous avez publiée comme réponse pour toute autre personne demandant la même chose (jusqu'à présent, uniquement possible en dupliquant à l'infini la couche dans PS)

1

Cela semble incroyablement complexe. Si je comprends bien la question d'origine et ses diverses clarifications, le problème est de prendre une image arbitraire contenant de la transparence et de la rendre entièrement opaque, puis d'appliquer les valeurs alpha originales comme masque pour recréer l'apparence d'origine.

Si telle est la question, c'est une réponse très simple, quoique un peu fastidieuse.

  1. Copiez le calque 10 fois. La transparence "se remplira" dans l'image composite.

  2. Fusionnez toutes les copies (mais PAS le calque d'origine , dont vous aurez besoin pour les dernières étapes).

  3. Répétez les étapes 1 et 2 avec le calque fusionné, puis recommencez. À ce stade, tous les pixels qui étaient à moins de 100% transparents sont maintenant 100% opaques (s'il y a des strates, répétez simplement le processus jusqu'à ce qu'il n'y en ait pas). C'est autant d'informations sur l'image qu'il est possible de récupérer.

  4. Ctl / Cmd-Cliquez sur la vignette du calque d' origine pour charger sa transparence.

  5. Une fois le nouveau calque opaque sélectionné, cliquez sur l'icône de masque de calque dans le panneau Calques.


0

Ok, c'est en fait assez simple (vous devez ignorer les fourmis en marche)

Créez un nouveau calque et remplissez-le entièrement avec la couleur que vous utilisez (si l'échantillonnage le prend au point mort de la première image)

entrez la description de l'image ici

entrez la description de l'image ici

Ensuite, prenez votre première image et CTRL + Cliquez sur la vignette du calque, vous devriez voir une version de ceci: entrez la description de l'image ici

Comme je l'ai déjà dit: ignorez les fourmis en marche, la mise en drapeau prend effet automatiquement dans CS5.

Assurez-vous ensuite que le calque rempli est sélectionné et cliquez sur le bouton de masque:

entrez la description de l'image ici

Ensuite, cachez simplement le calque inférieur et vous devriez avoir terminé, avec l'effet exact que vous recherchez :)

entrez la description de l'image ici

Et c'est ainsi que le reverse engineering d'un masque appliqué dans CS5. La fonction de sélection de couche CS5 est assez avancée, donc la plupart du temps, ignorez simplement les fourmis en marche car elles ne montrent pas correctement les plumes qui continueront avec la sélection :)

J'espère que cela marchera pour toi.


merci pour votre réponse mais ce n'est pas ce que je recherche - comme expliqué le rouge constant est juste pour cet exemple! cela peut être N'IMPORTE QUELLE image (pas seulement une couleur de remplissage constante) - et bien sûr je n'ai pas l'image non transparente originale disponible
Mat

Eh bien, vous devez publier votre image dans votre question. Si vous publiez un remplissage constant, nous allons répondre en fonction d'un remplissage constant. Essayez d'utiliser les techniques ici cependant, la sélection de CS5 est très avancée, cela peut vous surprendre. Ça m'a fait.
Kyle

bien sûr, je connais ces techniques de sélection! le problème en question est de savoir comment accéder à la partie RVB uniquement d'un calque transparent
Mat

Au-dessus des couches, il y a trois onglets, cliquez sur les canaux. Là, vous avez rouge, vert, bleu et masque de calque. C'est peut-être ce que vous recherchez?
Kyle

mais un calque comme dans neo.cycovery.com/alpha_prob2.jpg n'affiche pas de canal alpha - au lieu de cela, il affiche simplement les canaux RG et B avec une transparence déjà appliquée
Mat

0

Ce que vous voulez faire est facilement fait par un plugin, comme le plugin "Supprimer la transparence" de Photofreebies. Commencez par cliquer sur le calque pour sélectionner les pixels transparents, puis enregistrez ces informations de transparence dans un nouveau canal pour les conserver. Ensuite, vous appliquez le filtre "Supprimer la transparence" et vous voyez les pixels "cachés" de votre calque devenir opaques (assez intéressant de voir comment Photoshop met en page vos pixels 100% transparents BTW). Je souhaite vraiment depuis des années que cela soit intégré à Photoshop en mode natif, mais hélas, trop avancé, je suppose.

Malheureusement, je ne trouve pas de version compatible Photoshop CS6 d'un tel plugin pour Mac, donc je suis bloqué en ce moment. GraphicConverter peut le faire aussi (Supprimer le canal Alpha).


0

Voici la réponse:

  1. Faites un calque avec le truc que vous voulez dans l'image.

  2. Faites une sélection pour le canal alpha souhaité.

  3. Faites de la sélection un "masque de calque" pour le calque d'image.

  4. Cliquez avec le bouton droit sur le masque de fusion et "Appliquer le masque de fusion".

Maintenant, la magie commence:

  1. Allez dans "Layer", et en bas: "Matting", puis choisissez "Remove black matte".

Je vous en prie!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.