8722 sujets

Développement web côté serveur, CMS

Bonjour à tous,

J'utilise la librairie GD pour faire de " l'assemblage photo " sous PHP. Je souahite donc créer un fond transparent de taille $width et de hauteur $height. Je souhaite ensuite coller un png possédant de la transparence (ombres).

Le fond transparent pas de problème ; j'ai tester en lui ajouter un rectangle rouge tout est bon. Quand je suis passé à l'étape collage d'un png ; cela s'est compliqué. Je perds la transparence et il passe mon fond en blanc et la transparence du png en noir.

Voici mon code :

        $width = 372;
        $height = 702;
        
        //création du gabarit
        $image = imagecreatetruecolor($width, $height);
        //transparence
        $black = imagecolorallocate($image, 0, 0, 0);
        imagecolortransparent($image, $black);
        
        //activation de l'alphablending
        imagealphablending($image, true);
        
        //création du fond
        $fond = imagecreatefrompng('../assets/uploads/fonds/'.$format->imageFond);
        
        //fusion
        imagecopymerge($image, $fond, 0, 0, 0, 0, $width, $height, 100);
        
        // On déactive l'alphablending
        imagealphablending($image, false);
        // Sauvegarde des données alpha
        imagesavealpha($image, true);

        //sauvegarde de l'image : 0 de compression
        imagepng('test.png', 0);

        //on libère la ressource
        $image = null;


Est ce que quelqu'un à déjà tenter la fusion de fond transparent et d'images composées de transparence ? Comment ? Ou est ce que je me plante ?

Merci à tous !
Modifié par mini-truc (03 Oct 2013 - 13:20)
Si tu trouves, je suis preneuse. J'ai tenté avec désespoir hier durant plus de 4 heures pour gérer mon watermark transparent sur image png avec transparente.

Et rien à faire.

Transparence sur non-transparence, ça passe. Non-transparent sur transparent idem. Transparent sur transparent, ça plante, invariablement... (malgré une douzaine de test)
Modifié par Lothindil (03 Oct 2013 - 13:17)
Tiens moi au courant si tu trouves ; sinon j'ai fait des tests sous imagick çà fonctionne ; mais mais on perd sérieusement en qualité lorsque tu veux combiner texte et image.
Modifié par mini-truc (03 Oct 2013 - 13:48)
Je me suis débrouiller en faisant un mixte des deux au cas où çà pourrait t'aider dans ce que tu fais. Dans mon cas, çà passe malgrès que je pense qu'il y a facilement plus optimisé...

Je créer d'abord mon fond transparent avec imagick (qui est une composition d'une image transparente et d'une impage avec des ombres mi-transparente)


        //création du gabarit transparent
        $image = new Imagick();
        $image->newImage($width, $height, new ImagickPixel('none'));
        $image->setImageFormat('png');
        
        //appel de mon image semi transparente
        $image2 = new Imagick();
        $image2->readImage('image_de_fond_ombres.png');
        
        //fusion de mes deux images
        $image->compositeimage($image2, $image2->getimagecompose(), 0, 0);

        //on libère la ressource2
        $image2->clear();
        $image2->destroy();
        
        //sauvegarde de ma composition
        $fond_file = 'temp_fond.png';
        $image->writeimage($fond_file);

        //on libère la ressource1
        $image->clear();
        $image->destroy();


Ensuite s'il te reste des montage à faire comme moi avec des textes je reprend GD

        //chargement de l'image temporaire
        $image = imagecreatefrompng($fond_file);

        //charger la transparence
        imageAlphaBlending($image, true);
        imageSaveAlpha($image, true);
Bonjour,

Je ne comprend pas trop la finalité, étant donné que si on colle une image transparente sur un fond de la même taille on se retrouve avec la même image...

Enfin bon, j'ai pas du comprendre un truc, sinon pour le code c'est plutôt quelque chose comme ça:
$width = 372;
$height = 702;
        
//création du gabarit
$image = imagecreatetruecolor($width, $height);
        
/pas très logique mais indispensable...
imagealphablending($image,false);
        
//transparence
$color = imagecolorallocatealpha($image, 255, 255, 255, 127);
imagefilledrectangle($image, 0, 0, $width,$height,$color);

//activation de l'alphablending
imagealphablending($image, true);
imagesavealpha($image, true);
        
//création du fond
  $fond = imagecreatefrompng('../assets/uploads/fonds/'.$format->imageFond);
        
//fusion
imagecopyresampled($image,$fond, 0, 0, 0, 0,$width,$height,$width,$height);
        
//sauvegarde de l'image : 0 de compression
imagepng($image,'test.png', 0);

//on libère la ressource
$image = null;


Tu peux jouer sur le paramètres de imagecopyresampled pour placer ton collage ou tu veux sur le fond

edit: imagepng() il faut mettre la ressource en paramètre...
Modifié par matmat (03 Oct 2013 - 15:37)
Merci @matmat ; en faite la seule différence c'est :

imagealphablending($image,false);

sur ma première image qui est censé être transparent ?


Je ne pense pas être clair mais en gros je pars d'un gabarit et je fusionne une image qui n'a pas forcément la même taille... Mais je dois respecter le gabarit initial sans déformer l'image ; ni la resizer.
Regarde bien le code, il y a pas mal de différences.

Pour positionner l'image il faut utiliser les paramètres de imagecopyresampled

les deux derniers, c'est la taille finale, les deux avant derniers correspondent à la taille de ton image collée
matmat a écrit :

Pour positionner l'image il faut utiliser les paramètres de imagecopyresampled

les deux derniers, c'est la taille finale, les deux avant derniers correspondent à la taille de ton image collée


Je ne veux pas déformer mon image ni la redimensionner ... donc en laissant ces paramètres à zéro il prend par défaut la taille initiale ce que je souhaite faire. Je ne pense pas que ce soit à cause de ses paramètres que la transparence ne fonctionne pas Smiley ohwell