2016-02-18 4 views
4

je suis en train de fusionner deux images transparentes en utilisant php, mais l'image a une bordure noire et des taches que je ne pouvais pas comprendre l'échantillon question ci-dessous est mon code ci-jointphp fusion de deux images semble cassé

$image1=$image2='imagepath.png'; 
imagealphablending($image2, true); 
imagesavealpha($image2, true); 

$w=imagesx($image1); 
$h=imagesy($image1); 

$final = imagecreatetruecolor($w, $h); 

$black = imagecolorallocate($final, 0, 0, 0); 
$backgroundColor = imagecolortransparent($final, $black); 

$percent = 0.583; 
$new_width = $w * $percent; 
$new_height = $h * $percent; 
$wshift = $w/8.5; 
$hshift = $h/2.5; 
imagecopy($final, $image1, 0,0,0,0,$w,$h); 

imagecopyresized($final, $image2,$wshift,$hshift,0,0, $new_width, $new_height, $w, $h); 

header('Content-Type: image/png'); 
imagepng($final); 

imagedestroy($image2); 
imagedestroy($image1); 
imagedestroy($final); 

test:

voir en action: http://goo.gl/qMWNB4

URL de l'image: http://goo.gl/pR59MT

+0

Ce n'est ni une bordure en pointillés , ni une frontière du tout en fait. Cela arrive parce que vos images sont à basse résolution. – Matheno

+0

j'ai testé avec 300 * 300 images px même question comment si même avec 600 * 600 px même numéro – saurav

+0

Le 'imagecopymerge' peut aider un peu. http://php.net/manual/fr/function.imagecopymerge.php – Michas

Répondre

0

OK donc j'ai eu un aller et ont réussi à:B) Débarrassez-vous d'assez de noir que je suis sûr que vous pouvez terminer le travail!

$image1=$image2=imagecreatefrompng('test1.png'); 
imagealphablending($image2, false); 
imagesavealpha($image2, true); 

$w=imagesx($image1); 
$h=imagesy($image1); 

$final = imagecreatetruecolor($w, $h); 

$percent = 0.583; 
$new_width = $w * $percent; 
$new_height = $h * $percent; 
$wshift = $w/8.5; 
$hshift = $h/2.5; 

$temp = imagecreatetruecolor($new_width, $new_height); 

imagecopymerge ($final, $image1, 0,0,0,0, $w , $h , 100); 
imagecopymerge ($temp, $image2, 0,0,0,0, $w, $h, 100); 

$black2 = imagecolorallocate($temp, 0, 0, 0); 
$backgroundColor = imagecolortransparent($temp, $black2); 

imagecopyresized($final, $temp,$wshift,$hshift,0,0, $new_width, $new_height, $w, $h); 

$black = imagecolorallocate($final, 0, 0, 0); 
$backgroundColor = imagecolortransparent($final, $black); 

imagepng($final, 'output8.png'); 

espère que vous y arrivez bientôt - retour à la journée de travail pour moi :)

+0

Je vais avoir un autre coup maintenant - faire des progrès. C'est une tâche amusante! – puppyFlo

+0

merci que «peu mieux que l'ancien – saurav

+0

Pas habituellement, pourquoi avez-vous une offre? Avez-vous réussi à faire avancer le problème? – puppyFlo

0

La bordure noire est causée par l'utilisation imagecolortransparent. Ceci est destiné aux images à base de palette, pas à la vraie couleur, et utilise une seule couleur pour la transparence dans tout le fichier au lieu de la valeur alpha de chaque pixel.

L'astuce pour obtenir ce travail est en réglant le mode de fusion correct au bon moment:

$img = imagecreatefrompng('35477413.png'); 

$w = imagesx($img); 
$h = imagesy($img); 

$final = imagecreatetruecolor($w, $h); 
imagesavealpha($final, true); 

$percent = 0.583; 
$new_width = $w * $percent; 
$new_height = $h * $percent; 
$wshift = $w/8.5; 
$hshift = $h/2.5; 

// disable alpha blending so that transparent pixels replace target pixels. 
imagealphablending($final, false); 
imagecopy($final, $img, 0, 0, 0, 0, $w, $h); 

// enable alpha blending so that transparent pixels blend with target pixels. 
imagealphablending($final, true); 
imagecopyresized($final, $img, $wshift, $hshift, 0, 0, $new_width, $new_height, $w, $h); 

header('Content-Type: image/png'); 
imagepng($final); 

imagedestroy($img); 
imagedestroy($final); 

Cela donne le résultat suivant:

result