2015-10-22 1 views
1

Je cherche à utiliser Imagemagick (via PHP) pour traiter des fichiers PNG avec des arrière-plans transparents et des pixels semi-transparents (comme des dégradés). Les images devront être modifiées comme ceci: 1. faire tous les pixels non transparents même, couleur unie (noir est très bien)
2. Développez les bords des formes dans l'image par un 25 pixelsUtiliser Imagemagick pour répliquer la fonctionnalité «expand selection» de photoshop

avec cette entrée (BG transparent, certains pixels sont semi-transparents):
Input PNG

Je me attends sortie comme ceci:
Output PNG

ce ne redimensionne que l'image. Je suis à la recherche de fonctionnalités similaires à la façon dont photoshop développe une sélection (par exemple, l'espace dans le cercle supérieur est annulé car il est plus petit que l'expansion de 25 pixels).

Actuellement, j'ai un code qui scanne une image et trouve les bords, mais échoue lorsqu'il y a plusieurs formes qui ne sont pas connectées dans une image. Est-ce que Imagemagick a un moyen de le faire ou existe-t-il un algorithme que je peux utiliser pour scanner une image et générer la sortie dont j'ai besoin? Vitesse est un souci, mais je peux vivre avec une solution lente tant que cela fonctionne.

Répondre

4

Cette réponse est un travail en cours, je pense que nous pouvons vous y bien ...

Fondamentalement, l'étape 1) signifie que vous souhaitez définir les canaux RVB en noir sur l'ensemble de l'image, tout en laissant la transparence pour déterminer les formes - je pense. Eh bien, nous pouvons le faire que beaucoup de moyens, mais nous allons utiliser un seuil comme celui-ci:

convert shapes.png -threshold 100% result.png 

enter image description here

Maintenant vous souhaitez étendre la sélection, mais la sélection est vraiment que dans l'Alpha/canal de transparence nous limitons donc nos opérations à ce canal qui permettra de maintenir la vitesse. En termes morphologiques, vous êtes à la recherche d'une dilatation, de sorte que vous pouvez faire quelque chose comme ceci:

convert shapes.png -threshold 100% -channel A -morphology dilate octagon:25 result.png 

Il existe d'autres formes (disque, diamant, etc.) et d'autres degrés de dilatation (j'ai choisi 25 dilatations) - ont un coup d'oeil aux excellentes pages d'exemples de ImageMagick d'Anthony Thyssen ... here.

enter image description here

Je ne sais pas ce qui se passe avec les gradations dans la transparence, donc je les ai zappé avec un -threshold supplémentaire sur le canal alpha:

convert shapes.png -threshold 100% -channel A -morphology dilate octagon:25 -threshold 99% result.png 

enter image description here

Je vais laissez-vous le traduire en PHP - devrait être assez facile.

+0

Ceci est une solution parfaite. D'une certaine manière, l'extension PHP Imagemagick ne supporte pas la morphologie (même si c'est dans les docs). Merci pour votre solution élégante. – Maximillian

+0

Excellent - heureux que cela a fonctionné pour vous! Je suis surpris que la substance de la morphologie ne soit pas dans la version PHP. Je n'utilise généralement pas PHP, mais peut-être @emcconville peut-il faire la lumière ... –