Collage images transparentes

WRInaute discret
Bonjour
Un petit souci que vous allez régler rapidement je pense.
J'accole 2 images transparente (png), de taille différente, alignées à la base.
Le résultat : 2 images transparentes, MAIS, la plus petite est complétée par du noir dans l'image résultante (au-dessus du A).
ab.png

Vous l'avez deviné, c'est la base d'un générateur de texte à partir de lettres-images.

Mon code inspiré de plusieurs exemples du web :
Code:
function merge($image_1, $image_2, $image_result)
	{
		list($width_1, $height_1) = getimagesize($image_1);
		$height_max = $height_1;
		list($width_2, $height_2) = getimagesize($image_2);
		if ($height_2 > $height_max) $height_max = $height_2;
		
		$frame = imagecreatetruecolor($width_1 + $width_2, $height_max);
		imagealphablending($frame, false);
		imagesavealpha($frame, true);
		$trans_colour = imagecolorallocatealpha($frame, 0, 0, 0, 127);
		imagefill($frame, 0, 0, $trans_colour);
		
		$image_1 = imagecreatefrompng($image_1);
		$image_2 = imagecreatefrompng($image_2);
		
		imagecopy($frame, $image_1, 0, $height_max - $height_1, 0, 0, $width_1, $height_1);
		imagecopy($frame, $image_2, $width_1, $height_max - $height_2, 0, 0, $width_2, $height_2);
		
		imagepng($frame, $image_result);
		
		imagedestroy($frame);
		imagedestroy($image_1);
		imagedestroy($image_2);
	}
merge('1.png', '2.png', 'temp/12.png');
echo '<img src="temp/ab.png">';

Bonne cogitation et bonne journée
 
WRInaute discret
Merci de votre intérêt

Je ne veux pas rendre le noir transparent, mes images comprenant du noir
Ai essayé de remplacé imagecopy par imagecopymerge, ça ne change rien
Le fond utilisé ($frame) est bien transparent sinon l'image finale ($image_result) ne le serait pas
la copie de mes 2 images dans le fond redimensionné à la hauteur maxi de ces 2 images reste bien transparente
Ce n'est que le complément de l'image la plus petite qui ne l'est pas
Je continue à chercher (ça fait 2 jours)
 
WRInaute discret
On peut voir les images d'origines ?
J'ai fait un test chez moi et ça fonctionne bien.
Mais pour avoir les images 1 et 2 j'ai découpé l'image du message 1 sous Photoshop.
 
WRInaute discret
Quel version de GD Image / lib PNG ?

Sous OVH en mutu j'ai ça :
Code:
gd
GD Support			enabled
GD Version			bundled (2.1.0 compatible)
FreeType Support		enabled
FreeType Linkage		with freetype
FreeType Version		2.4.2
T1Lib Support			enabled
GIF Read Support		enabled
GIF Create Support		enabled
JPEG Support			enabled
libJPEG Version 		6b
PNG Support			enabled
libPNG Version			1.2.44
WBMP Support			enabled
XPM Support			enabled
libXpm Version			30411
XBM Support			enabled
 
WRInaute discret
gd

GD Support enabled
GD Version 2.0
FreeType Support enabled
FreeType Linkage with freetype
FreeType Version 2.4.2
T1Lib Support enabled
GIF Read Support enabled
GIF Create Support enabled
JPEG Support enabled
libJPEG Version 6b
PNG Support enabled
libPNG Version 1.2.44
WBMP Support enabled

Directive Local Value Master Value
gd.jpeg_ignore_warning 0 0
 
WRInaute discret
Bonjour

La nuit portant conseil, je crois avoir trouvé la solution qui se trouve hors du script.
Ce serait de modifier la taille de tous les caractères de ma police images pour qu'elles aient toutes la même hauteur
De plus ça arrangerait le cas des caractères devant être alignés différemment, par exemple le "+" qui devra être centré verticalement
Ca devrait marcher avec cette partie de script, pour le reste j'ai un modèle existant pour formulaire de choix de terme ou phrase, de découpage ...

La suite bientôt, bonne journée
 
WRInaute discret
Pour ceux que ça intéresse le code POUR 2 IMAGES TRANSPARENTES DE MEME HAUTEUR :
Code:
function merge($image_1, $image_2, $image_result)
	{
		list($width_1, $height_1) = getimagesize($image_1);
		$height = $height_1;
		list($width_2, $height_2) = getimagesize($image_2);
		if ($height_2 > $height) $height = $height_2;
		$width = $width_1 + $width_2;
		
		$frame = imagecreatetruecolor($width, $height);
		imagealphablending($frame, false);
		imagesavealpha($frame, true);
		$trans_colour = imagecolorallocatealpha($frame, 0, 0, 0, 127);
		imagefill($frame, 0, 0, $trans_colour);
		
		$image_1 = imagecreatefrompng($image_1);
		$image_2 = imagecreatefrompng($image_2);
		
		imagecopy($frame, $image_1, 0, 0, 0, 0, $width_1, $height);
		imagecopy($frame, $image_2, $width_1, 0, 0, 0, $width_2, $height);
		
		imagepng($frame, 'temp/'.$image_result);
		
		imagedestroy($frame);
		imagedestroy($image_1);
		imagedestroy($image_2);
	}
merge('a.png', 'b.png', 'ab.png');
echo '<img src="temp/ab.png">';
 
WRInaute discret
Bonjour
C'est à s'en arracher les cheveux
J'ai modifié le truc avec boucles, tableaux ... pour utilisation "universelle" !
Et ça ne marche plus (à partir de la partie GD de ce script pas encore très optimisé et depuis des heures, cherche l'erreur
Code:
<?php
// Images des carateres de la police toutes transparentes et de même hauteur
// Toutes images dans le répertoire courant - Image résultante dans répertoire temporaire
function merge($data, $interval)
	{
		// INITIALISATIONS
		$result = "/temp/".$data.".png";
		$images = array();
		$letters = array();
		$width = array();
		$x_init = array();
		$width_result = 0;
		// DECOUPAGE DE L'ENTREE EN CARACTERES IMAGES UNIQUES
		$nb = strlen($data);
		for ($i=0; $i<$nb; $i++) $letters[$i] = substr($data, $i, 1).'.png';
		// CALCUL POSITION ET LARGEUR DE CHAQUE IMAGE ET DES DIMENSIONS DE L'IMAGE FINALE
		$i = 0;
		foreach($letters as $value)
			{
				$x_init[$i] = array_sum($width) + ($i * $interval);
				$size = getimagesize($value);
				array_push($width, $size[0]);
				$i++;
			}
		$height = $size[1]; // toutes les images sont de même hauteur
		$width_result = array_sum($width) + ($nb * $interval);
		// CREATION IMAGE FINALE VIDE ET TRANSPARENTE
		$empty = imagecreatetruecolor($width_result, $height);
		imagealphablending($empty, false);
		imagesavealpha($empty, true);
		$trans_colour = imagecolorallocatealpha($empty, 0, 0, 0, 127);
		imagefill($empty, 0, 0, $trans_colour);

		// POUR CHAQUE LETTRE DU MOT/PHRASE
		for ($i=0; $i<$nb; $i++)
			{
				// Création
				$images[$i] = imagecreatefrompng($letters[$i]);
				// Copie dans l'image finale
				imagecopy($empty, $images[$i], $x_init[$i], 0, 0, 0, $width[$i], $height);
			}
		// CREATION IMAGE FINALE
		imagepng($empty, $result);
		// NETTOYAGE
		imagedestroy($empty);
		for ($i=0; $i<$nb; $i++) imagedestroy($images[$i]);
	}
// LANCEMENT COLLAGE ET AFFICHAGE IMAGE RESULTANTE
$data = "exemple"; // texte à traduire en image avec la police graphique
$interval = 5; // espace à droite de chaque caractère du texte
merge($data, $interval);
echo '<img src="/temp/'.$data.'.png">';
?>
Trouverez- vous le schmilblick qui coince ?
 
WRInaute discret
Bizarre
Losqu'après imagefill je fais
Code:
header('Content-type: image/png');
imagepng($empty);
ce qui s'affiche est le code d'un png, soit du genre
Code:
PNG  IHDRÐ]7²}IDATxœíÕÁ À À°ƒýwng „dO_ÖÌ|Ù·àE @` ( @` ( @` ( @` ( @` ( @` ( @` ( @` ( @` ( @` ( @` ( @` ( @` ( @` ( @` ( @` ( @` ( @` ( @` ( @` ( @` ( @` ( @` üáæ¹÷7šIEND®B`‚
Est-ce que ma librairie GD ne serait pas "vérolée" ?
J'ai pourtant un autre script (watermark transparent sur image) qui fonctionne.
 
Discussions similaires
Haut