9
votes

Méthode de conversion de PNGS en Alpha Premulgiplied

À la recherche d'une sorte d'outil simple ou de processus pour Windows qui me permettra de convertir une ou plusieurs pngs standard en alpha Premulgiplied.

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.

Merci!


0 commentaires

5 Réponses :


1
votes

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)


0 commentaires

2
votes

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

La version Python est basée sur la réponse CSSNDRX. La version C est basée sur libpng.


3 commentaires

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.



13
votes

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())


0 commentaires

13
votes

Utiliser ImageMagick, comme demandé: xxx

merci @ mf511 pour la mise à jour.


3 commentaires

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


La deuxième commande fonctionne bien! Merci.



0
votes

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)


0 commentaires