2017-02-12 2 views
0

J'essaie de créer des images à partir de données de texte dynamiques dans GD et de mettre un logo dans le coin supérieur. La couleur d'arrière-plan de l'image change en fonction des données transmises. Je ne peux donc pas enregistrer le logo en tant qu'image sans canal alpha.Charger le png transparent dans gd php mais ne pas rendre son arrière-plan transparent

Je crée l'image, la remplis avec la couleur d'arrière-plan dynamique en utilisant imagefill(), puis j'ajoute le texte en utilisant imagettftext() et charge mon logo. Je n'arrive pas à insérer le logo dans l'image garder sa couleur de fond de «transparent». Je voudrais donc que la couleur d'arrière-plan dynamique soit définie avec imagefill(). Cependant, il conserve l'arrière-plan de transparence dans lequel il a été chargé et écrit donc cette partie du png comme transparente. J'ai essayé d'appeler imagefill() sur le logo après qu'il ait été chargé (en utilisant le même rgb qui définit l'arrière-plan de l'image de destination) mais cela n'a rien fait.

Ci-dessous mon code:

$background = $_GET['background']; 
$data1 = $_GET['data1']; 
$data2 = $_GET['data2']; 
$r = $_GET['r']; 
$g = $_GET['g']; 
$b = $_GET['b']; 

$png_image = imagecreate(400, 200); 
$gd_text_color = imagecolorallocate($png_image, 255, 255, 255); 
$gd_background_color = imagecolorallocate($png_image, $r, $g, $b); 
imagefill($png_image, 0, 0, $gd_background); 

$text1 = "test test $data1"; 
$text2 = "test test again $data2"; 
$font = 'Lato-regular.ttf'; 
imagettftext($png_image, 18, 0, 20, 20, $gd_text_color, $font, $text1); 
imagettftext($png_image, 18, 0, 20, 50, $gd_text_color, $font, $text2); 

//trying to get this logo and place it in the corner. 
$logo = imagecreatefrompng("images/logo.png"); 
imagecopy($png_image, $logo, 10, 10, 0, 0, 100, 30); 

header('Content-type: image/png'); 
imagepng($png_image, $filename); 
imagedestroy($png_image); 

est ici la sortie de ce code: http://i.imgur.com/n25h9Js.png Et voici ce que l'image ressemble lorsqu'il est chargé dans un programme qui accepte un canal alpha: http://i.imgur.com/3OIRupN.png

Est-ce que quelqu'un savoir comment je réaliserais ce que je tente?

Merci pour votre temps.

EDIT

Pour essayer d'expliquer ce que je veux ici est une autre image. L'image du haut est ce que je reçois actuellement, et l'image du bas est ce que je veux. J'essaye simplement de charger dans un PNG transparent qui peut se reposer sur des arrière-plans colorés différents. Cependant, je l'obtiens soit comme cela est montré ici (fond transparent) ou comme fond noir (parce que je suppose que le canal alpha n'est pas regardé?). J'espère que cela t'aides. Image: Error on top, mocked up version of how I want it below.

Modifier 2

Selon le commentaire ci-dessous, je l'ai changé de imagecreate() à imagecreatetruecolor() et maintenant il fonctionne très bien! J'adorerais une explication pourquoi cela a résolu si quelqu'un a le temps mais pour l'instant, merci à tous ceux qui ont commenté ou même passé votre temps à regarder cette question.

+2

Je ne suis pas sûr de ce que vous essayez réellement de faire - si vous voulez que l'image finale ait de la transparence ou non. Cependant, votre 'imagecreate()' peut vous causer des problèmes car il crée une image palettisée - peut-être vous avez besoin de 'imagecreatetruecolour()'. –

+1

imagecreatetruecolor (pas la version britannique!) –

+0

J'essaie de créer une image qui n'a pas de transparence, correcte. Je suppose que mon explication était déroutante, donc je vais essayer de nouveau: la couleur de fond de l'image finale dépendra des données d'entrée et je ne peux donc pas créer une image "logo" avec la même couleur de fond de l'image finale. Donc, je le charge en PNG avec transparence. J'espère pouvoir le placer en haut à gauche de façon à ce qu'il reste sur la couleur de fond dynamique, mais GD rend cette partie de l'image transparente, ce que je ne veux pas. J'ai inclus une capture d'écran dans le message principal montrant ce que j'ai actuellement et ce que je veux. – poncho

Répondre

0

Je soupçonne que votre imagecreate() peut vous causer des problèmes car il crée une image palettisée qui n'a pas la flexibilité ou la largeur d'expression d'une image en vraies couleurs. Je suggère de le remplacer par imagecreatetruecolor().