À la recherche d'une sorte d'outil simple ou de processus pour Windows em> qui me permettra de convertir une ou plusieurs pngs standard en alpha Premulgiplied. P>
Les outils de ligne de commande sont idéaux; J'ai facilement accès à Pil (bibliothèque d'imagerie Python) et à ImageMagick, mais installera un autre outil si cela facilite la vie. P>
Merci! P>
5 Réponses :
Il devrait être possible de le faire par PIL. Voici un contour approximatif des étapes:
1) Chargez l'image et convertir en tableau NUMPY P>
new_im = Image.fromarray(matrix)
Je viens de libérer un peu de code dans Python et en C, cela fait ce que vous recherchez. C'est sur GitHub: http://github.com/maxme/png-alpha-premultiplier p>
La version Python est basée sur la réponse CSSNDRX. La version C est basée sur libpng. P>
Merci un tas. :) Aller avec cette réponse parce que je trouve le code plus facile à comprendre que l'exemple de Madlag, bien que peut-être pas aussi intelligent.
J'aime le fait que son code vérifie si l'image est prématuré. Non demandé par le pot mais toujours très agréable.
Pas étonnant que la version Python soit lente - vous en boucle sur chaque pixel. La solution Python de Francois est beaucoup plus rapide.
Une version plus complète de la réponse CSSNDRX, à l'aide de la tranchée dans NUMPY pour améliorer la vitesse:
import Image import numpy im = Image.open('myimage.png').convert('RGBA') a = numpy.fromstring(im.tostring(), dtype=numpy.uint8) alphaLayer = a[3::4] / 255.0 a[::4] *= alphaLayer a[1::4] *= alphaLayer a[2::4] *= alphaLayer im = Image.fromstring("RGBA", im.size, a.tostring())
Utiliser ImageMagick, comme demandé: merci @ mf511 pour la mise à jour. p> p>
Cela ne préserve pas le canal alpha, il multiplie simplement tous les canaux avec alpha et semble ensuite jeter l'alpha entièrement. J'ai essayé cela sur ImageMagick 7.0.5-4 Q16.
Oui, mais cela a travaillé auparavant. Utilisez ceci comme alternative: convert in.png -background noir -alpha Supprimer in.png -commez Copy_opity -composite Out.png code>
La deuxième commande fonctionne bien! Merci.
Utiliser PIL uniquement:
def premultiplyAlpha(img): # fake transparent image to blend with transparent = Image.new("RGBA", img.size, (0, 0, 0, 0)) # blend with transparent image using own alpha return Image.composite(img, transparent, img)