2013-03-06 34 views
14

Voglio fare quanto segue in PHP in combinazione con GD. ImageMagick non è un'opzione, sfortunatamente, ma questo sembra un problema così comune che lo ha la soluzione, non riesco proprio a trovarlo.PHP/GD - sfondo trasparente

Desidero creare un PNG con uno sfondo trasparente. Poi voglio disegnare un rettangolo su di esso, copiare un'immagine su di esso e aggiungere del testo. Un modo per farlo è la seguente:

$image = ImageCreateTrueColor (800, 600); 
imagecolortransparent ($image, 0); //0 is pure black, the default fill color 
imagerectangle (...); 
//code to copy an image 
imagettftext ($image, ...); 
imagepng ($image); 

Questo funziona bene, tranne quella parte dell'immagine copiata potrebbe essere nero, e/o il testo potrebbe essere nero. Questo diventa anche trasparente, che è qualcosa che io non voglio .

imagefill ($image, 0,0, 0x7FFF0000); 
imagetransparent ($image, 0x7FFF0000); 

Il codice sopra riportato è qualcosa che ho trovato online, che lo riempie di rosso, quindi diventa rosso trasparente. Di nuovo, questo fa sì che tutto il rosso nell'immagine diventi trasparente. Potrei scegliere un colore che è improbabile che si verifichi, ma non posso garantire questo.

C'è qualcosa che mi manca? Questo può essere risolto? Grazie per le vostre risposte!

risposta

26

imagecolortransparent probabilmente non è quello che desideri qui se stai unendo le immagini, poiché la trasparenza a un colore è sgradevole.

Invece, provare con una maschera riempimento trasparente in questo modo:

<?php 
$image = imagecreatetruecolor(100, 100); 

// Transparent Background 
imagealphablending($image, false); 
$transparency = imagecolorallocatealpha($image, 0, 0, 0, 127); 
imagefill($image, 0, 0, $transparency); 
imagesavealpha($image, true); 

// Drawing over 
$black = imagecolorallocate($image, 0, 0, 0); 
imagefilledrectangle($image, 25, 25, 75, 75, $black); 

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

default imagealphablending true sulle immagini a colori in modo da questo non fa nulla di diverso :) Inoltre, imagecreatetruecolor crea un'immagine nera, motivo per cui la il primo pezzo di codice usa imagecolortransparent (0); – Spinal

+0

In tal caso, non riesco a vedere il tuo problema. Ho provato quanto sopra disegnando un rettangolo nero al centro, e funziona perfettamente con la trasparenza in giro. –

+0

Davvero? Quindi probabilmente c'è qualcosa di sbagliato nel mio setup, perché se provo il codice seguente, ottengo un rettangolo blu con il nero che lo circonda! $ image = imagecreatetruecolor (800,600); imagealphablending ($ image, true); imagefilledrectangle ($ image, 50,50, 750, 550, imagecolorallocate ($ image, 0,0,128)); intestazione ('Content-type: image/PNG'); imagepng ($ image); – Spinal