2012-10-15 7 views
2

Avant de commencer, je veux juste noter que je suis un noob PHP. Ce que je veux faire est de teinter une image PNG en une couleur. Donc, tous les pixels transparents resteront transparents, et tous les pixels non transparents seront cette couleur. J'ai cherché beaucoup de sites pour cette réponse mais pour une raison quelconque je ne peux pas trouver ce que je veux.PHP: PNG tinitng (1 couleur)

Voici ma première tentative en fonction de différents exemples que j'ai trouvé:

<?php 
header('Content-Type: image/png'); 

$color = $_GET['color']; 
$im = imagecreatefrompng($_GET['img']); 
$width = imagesx($im); 
$height = imagesy($im); 
$imn = imagecreatetruecolor($width, $height); 
imagealphablending($imn,false); 
$col=imagecolorallocatealpha($imn,255,255,255,127); 
imagesavealpha($imn,true); 
imagefilledrectangle($imn,0,0,$width,$height,$col); 
imagealphablending($imn,true); 
imagecopy($imn, $im, 0, 0, 0, 0, $width, $height); 
imagefilter($imn, IMG_FILTER_GRAYSCALE); 


if ($color[0] == '#') 
$color = substr($color, 1); 

if (strlen($color) == 6) 
$r = $color[0].$color[1]; 
$g = $color[2].$color[3]; 
$b = $color[4].$color[5]; 

$r = hexdec($r); 
$g = hexdec($g); 
$b = hexdec($b); 

imagefilter($imn, IMG_FILTER_COLORIZE, $r, $g, $b); 

imagepng($imn); 
imagedestroy($imn); 

?> 

Essentiellement un exemple parfait de ce que je veux peut être vu ici. Le seul changement sera qu'au lieu de noir, je veux qu'il soit converti à la couleur spécifiée par l'utilisateur. Convert non-transparent pixels to black

Merci

=============================== 17/10/2012 Mise à jour

donc basée sur la réponse de xception, voici le code que je l'habitude d'exécuter son script:

<?php 

$source = "test.png"; 
$temp = "temp.png"; 
$color = "red"; 
$final = "FINAL.png"; 

exec("convert $source -alpha extract -threshold 0 -negate -transparent white $temp"); 
exec("convert $temp -fill $color -opaque black $final"); 
?> 

Il a travaillé, mais il y a un petit problème. Comme illustré dans les captures d'écran ci-dessous, il y a des bords irréguliers. Des idées sur la façon de lisser l'image pour qu'elle soit aussi belle que dans la capture d'écran BEFORE?

AVANT:

BEFORE

APRÈS:

AFTER

Répondre

1

Exemple en 2 étapes basées sur le lien que vous avez dirigé vers:

convert <source> -alpha extract -threshold 0 -negate -transparent white <tmp> 
convert <tmp> -fill red -opaque black <destination> 

remplacer <source>, <tmp>, <destination> avec les noms de fichiers appropriés, remplacez red par la couleur souhaitée.

EDIT: version plus courte trouvée par auteur question:

exec("convert $source -threshold 100% +level-colors '#00FF00', $final"); 
+0

Merci pour le commentaire. Donc je suis nouveau à PHP et ne suis pas familier avec ImageMagick et ne suis pas sûr de savoir comment utiliser votre exemple ci-dessus. Pensez-vous que vous pouvez me montrer un exemple complet? Aussi, si je lis ce que vous avez posté correctement, ce script va créer une image sur le serveur au lieu de l'afficher? J'ai besoin de quelque chose comme mon premier exemple où il traite l'image et l'affiche avec les changements. –

+0

Le traitement des images avec imagemagick en php est possible, vous avez besoin de l'extension imagick, mais je n'ai pas assez de temps pour transformer cet exemple en exemple car la documentation pour les fonctions est très mauvaise - sauf pour les noms de fonction et de paramètre rien n'a été documenté la dernière fois que je l'ai utilisé - m'a pris un jour pour comprendre comment faire ce que je voulais avec. Essayez googling le code php imagick équivalent pour chaque paramètre dans les lignes de commande que je vous ai donné. – xception

+0

Merci, je vais regarder dans et je posterai l'exemple une fois que je l'ai. –

Questions connexes