Convertir une image en niveaux de gris en image de canal alpha dans un shell Unix

14

J'ai une image en niveaux de gris. Je veux le convertir en PNG transparent, de sorte que les pixels noirs (dans l'image d'origine) deviennent complètement opaques, les pixels blancs deviennent entièrement transparents, un pixel gris à 50% deviendrait transparent à 50%, et ainsi de suite pour toutes les nuances entre.

Comment puis-je atteindre cet objectif?

(Oui, je sais que c'est presque la même question que la conversion de nuances de gris en canal alpha , mais je veux savoir comment faire cela en utilisant uniquement des outils de ligne de commande - par exemple ImageMagick ou NetPBM.)

Voici un exemple de résultat de la question susmentionnée. Cet exemple est un résultat que j'aimerais obtenir en utilisant uniquement des outils de ligne de commande.

Échantillon

Si vous ouvrez ce PNG dans une visionneuse qui prend en charge la transparence, vous verrez ce que je veux dire.

zrajm
la source

Réponses:

18

Ooookay. Après beaucoup de recherches sur Google et après avoir lu plus du manuel ImageMagick que je ne m'en soucie réellement, voici la réponse. Étant donné que vous avez appelé une image en niveaux de gris source.png, voici mes commandes.

Pour rendre transparent les pixels noirs et garder les pixels blancs tels quels, exécutez cette commande:

 convert source.png -alpha copy -fx '#fff' result.png

Pour rendre les pixels blancs transparents à la place tout en gardant le noir tel quel, utilisez:

 convert source.png -alpha copy -channel alpha -negate +channel -fx '#000' result.png

Expliquons plus en détail cette dernière commande:

  • convert - Est la commande ImageMagic (une parmi plusieurs)
  • source.png - L'image source en niveaux de gris.
  • -alpha copy - Copiez le contenu du fichier précédent dans le canal alpha.
  • -channel alpha - Spécifiez que seuls les opérateurs suivants doivent affecter le canal alpha.
  • -negate- Inverser le canal alpha ( -chanel alphan'affectera , en raison du précédent, aucune autre partie de l'image).
  • +channel- Spécifiez que seuls les opérateurs suivants doivent affecter les canaux de couleur et ne plus modifier le canal alpha. (Il s'agit de la valeur par défaut, et nous n'avons donc pas besoin de la fournir dans le premier exemple plus simple.)
  • -fx '#000'- Remplacez le contenu du canal de couleur par des pixels noirs. (En raison du +channelcanal alpha ne sera pas affecté).

Il est très important d'inclure cette dernière -fxoption, sinon tous les pixels semi-transparents de l'image générée conserveront les couleurs. (Étant donné que ces pixels sont à moitié transparents, cela peut ne pas être évident, mais le résultat final n'est pas ce à quoi on s'attend.)

J'ai trouvé la liste des options ImageMagick très utile.

zrajm
la source
assez bonne explication pour atteindre mon objectif, lorsque j'utilise une deuxième commande qui rend mon image plus sombre que l'image en niveaux de gris réelle. En fait, mon objectif d'obtenir la même tonalité de couleur qui est là en niveaux de gris autre que cette transparence est comme prévu. une idée pour y parvenir?
Hardik Patel
c'est très utile, merci! :) content de ne pas avoir à le découvrir par moi
Sam Watkins
Je t'aime!!!!!!
mescarra
Ces types de commentaires sont probablement mieux à m'envoyer via ce canal: okcupid.com/profile/zrajm :)
zrajm
1
Je ne sais pas pourquoi, mais avec la version actuelle (ImageMagick 7.0.7-21), j'obtiens uniquement une image blanche / noire solide, sans aucun canal alpha. J'ai copié la ligne de commande textuellement, en ne modifiant que les chemins d'accès aux fichiers d'entrée / sortie. Peut-être qu'ils ont fait des changements incompatibles en arrière.
Afficher le nom le
0

Avec ImageMagick 7.0, la réponse ci-dessus ne l'est plus. Mais vous pouvez utiliser:

convert source.png -channel rgb -fx '#fff' result.png

Aka, remplissez les canaux RVB de blanc et laissez l'alpha comme avant.

tito
la source
Je soupçonne que vous avez raté la «copie -alpha» :)
Chris
0

Avec imagemagick 7, je trouve qu'il est nécessaire de spécifier -channel RGBavant le -fx, sinon vous obtenez une image noire solide, comme ceci:

convert input.png -alpha copy -channel RGB -fx '#000' out.png

Et la négation est utile si vous voulez que le noir soit opaque et le blanc transparent:

convert input.png -negate -alpha copy -channel RGB -fx '#000' out.png
Chris
la source