JeuWeb - Crée ton jeu par navigateur
[Résolu] Fusion d'images - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Résolu] Fusion d'images (/showthread.php?tid=3920)



[Résolu] Fusion d'images - Juka - 22-04-2009

Bonjour bonjour,

je suis actuellement en train d'essayer de faire un petit module de création d'avatars pour un projet... mais je rencontre quelques petits soucis.
Je ne sais pas vraiment si cela concerne la programmation ou le graphisme en lui-même, c'est un mixe des deux... désolé d'avance si je suis mal placé ^^".

Mon soucis est le suivant :

Je cherche à fusionner deux images PNG en une troisième qui serait donc l'assemblage de ces deux là. Dans mon exemple c'est la base du corps avec les cheveux.
Après quelques déboires avec la librairie GD, je parviens à fusionner les deux images. Le problème est qu'une fois fusionné... les contours sont très pixelisés et c'est franchement pas top...

J'ai mis en ligne le résultat ( ici )
Au dessus se trouve donc l'image "fusionnée" et en dessous les deux PNG "de base" je dirais.
J'ai essayé de sauvegarder les PNG de différentes façons mais c'est le meilleur résultat que j'ai pu obtenir =/

Au cas où voici le fichier avatar.php
Code PHP :
<?php

$im
= imagecreatefrompng("model24.png");
$am = imagecreatefrompng("coiffure1.png");

$blanc = imagecolorallocate($im, 255, 255, 255);
imagecopy($im, $am, 0, 0, 0, 0, 300, 400);

imagecolortransparent($im, $blanc);

header('Content-type: image/png');

imagepng($im);
imagedestroy($im);
imagedestroy($am);

?>

Y'aurait-il un moyen de palier à ce problème ?

Merci d'avance,
Juka


RE: Fusion d'images - madri2 - 22-04-2009

il faut utiliser imagecopyresampled je crois

imagecopyresampled — Copie, redimensionne, rééchantillonne une image

imagecopy — Copie une partie d'une image

ça permet de recalculer les pixels pour justement ne pas avoir ton problème


RE: Fusion d'images - keke - 22-04-2009

Ton problème ne viendrait-il pas de

http://fr.php.net/manual/fr/function.imagesavealpha.php

Kéké
Indice : La transparence partielle vient d'un 4 eme canal appelé alpha.
<edit>
Dans ton cas, *** déja fait je crois **** il faudrait transformer tes images pour que le canal alpha soit activé ***** (plus besoin de définir BLANC comme étant une couleur)

puis transformer ton code ainsi.
Code :
<?php

$im = imagecreatefrompng("model24.png");
$am = imagecreatefrompng("coiffure1.png");
imagealphablending($im, true);
imagealphablending($am, true);

imagecopy($im, $am, 0, 0, 0, 0, 300, 400);

header('Content-type: image/png');

imagepng($im);
imagedestroy($im);
imagedestroy($am);

?>

Ca coute rien de tester. J'ai utilisé ce type de fonction sur mon jeu, je vais essayer de retrouver mon code.
</edit>

<edit bis pardon pour tous les edit ^^>
voici mon code
Code :
<?
//header("Content-type: image/png");
$font = 1;
$taille_font = imagefontwidth ( $font );
$taille_chaine = strlen ($nom_batiment);
$nb_blanc = (30-$taille_chaine) /2;

//$im = @imagecreate(160, 20)
$im = imagecreatefrompng ("./images/speciale/bandeau_nom_batiment.png")
   or die("Impossible d'initialiser la bibliothèque GD");
imageAlphaBlending($im, true);
imageSaveAlpha($im, true);
$background_color = imagecolorallocate($im, 0, 0, 0);
// $text_color = imagecolorallocate($im, 183, 220, 56); //b7dc38
$text_color = imagecolorallocate($im, 0, 0, 0); //noir
imagestring($im, 1, 5 + ($nb_blanc * $taille_font) , 5, "$nom_batiment", $text_color);
// imagepng($im);
imagepng($im, $nom_image_panneau);
imagedestroy($im);

?>

Prend ce que tu veux !

</edit>


RE: Fusion d'images - Juka - 22-04-2009

Merci beaucoup pour vos réponses =)

madri2 : j'ai essayé mais malheureusement, ça n'avait pas l'air de changer grand chose =/

keke : par contre, en jouant sur les alphas, ça marche impeccable =)
(j'ai retiré la transparence blanche et ajouté des imagealphablendig & imagesavealpha

Merci beaucoup =)


RE: [Résolu] Fusion d'images - keke - 22-04-2009

J'me demande si ça vaut la peine de mettre les 2 ... en fait. En relisant la doc, j'ai l'impression que l'alphaSaving remplace l'alphaBlending.

Vu que tu es en plein dedans ... tu voudrais pas faire le test ? tu mets en commentaire l'une des 2 lignes, puis l'autre ... et tu nous dis le résultat ?

Kéké


RE: [Résolu] Fusion d'images - Juka - 22-04-2009

Effectivement, alphablending ne sert pas... en revanche, quand je commente alphasave les soucis reviennent ^^
(hop, deux lignes d'économisées =))

Par contre, je me demandais un truc... ce n'est pas possible d'envoyer des variables (GET) vers mon avatar.php pour modifier l'image ? =/ J'ai beau essayer, sans succès... (pour changer la coiffure)


RE: [Résolu] Fusion d'images - keke - 22-04-2009

Et pourtant c'est faisable je pense. Je le fais bien moi et ça marche.

Sur un autre exemple de mon jeu :

appellé ainsi dans mon code
Code :
<img alt="progression : 65.5454545455 %" src="fonctions/image_interne/camembert_curseur.php?pourcentage=65.5454545455&amp;nom_image_fond=transpa_don1PAM&amp;nom_image=don1PAM">

et le code de ce fichier
Code :
<?php

$nom_image = $_REQUEST['nom_image'];
$nom_image_fond = $_REQUEST['nom_image_fond'];
// $nom_image = "test";
// $nom_image_fond = "transpa_test";

$pourcentage = min ( $_REQUEST['pourcentage'], 100); // pour éviter les maximums !
$pourcentage = max (0, $pourcentage); // pour éviter les minimums !
//$pourcentage = 100; // 40% de remplissage à
$resultant_pourcentage = ($pourcentage * 3.59 ) + 271; // 3.59 pour que à 100 % on ne finisse pas le cercle; et +1 pour initier le cercle à 1;

// create image
//$image = imagecreatetruecolor(100, 100);
$chemin_image = realpath ("../../images/speciale/".$nom_image.".png");
$image = imagecreatefrompng ($chemin_image);
imagealphablending ($image, true);
imageSaveAlpha($image, true);
$background_color = imagecolorallocate($image, 0, 0, 0);

$taille_x = 100;
$taille_y = 100;

// allocate some solors
$navy     = imagecolorallocate($image, 0x00, 0x00, 0x80);

imagefilledarc($image, ($taille_x / 2), ($taille_y / 2), 2* $taille_x, 2*$taille_y, $resultant_pourcentage, 270, $navy, IMG_ARC_PIE);
imagecolortransparent  ($image, $navy);

$chemin_image = realpath ("../../images/speciale/".$nom_image_fond.".png");
$image_fond = imagecreatefrompng ($chemin_image);
imagealphablending ($image_fond, true);
imageSaveAlpha($image_fond, true);
$background_color = imagecolorallocate($image_fond, 0, 0, 0);
imagecopymerge   ( $image_fond, $image, 0, 0, 0, 0, $taille_x, $taille_y, 100);

// flush image
header('Content-type: image/png');
imagepng($image_fond);
imagedestroy($image);
imagedestroy($image_fond);
?>

Tu reprends ce qui t'intéresse ^^. (je vois que là aussi ,j'ai fais appelle aux deux fonctions ^^)

kéké