2012-08-29 14 views
7

Ho cercato di ottenere la trasparenza per lavorare con la mia applicazione (che ridimensiona dinamicamente le immagini prima di memorizzarle) e penso di aver finalmente ristretto il problema dopo molte deviazioni su imagealphablending e imagesavealpha. L'immagine sorgente non viene mai caricata con una trasparenza adeguata!PHP GD imagecreatefromstring scarta transparency

Sarebbe una seria difficoltà architettonica caricare l'immagine da un file; questo codice viene utilizzato con un'API JSON che viene interrogata da un'app per iPhone ed è più facile in questo caso (e più coerente) caricare le immagini come stringhe con codifica Base64 nei dati POST. Devo assolutamente necessario per archiviare in qualche modo l'immagine come un file (solo in modo che PHP possa caricarlo di nuovo in memoria)? C'è forse un modo per creare un flusso da $fileData che può essere passato a imagecreatefrompng?

+0

Impossibile riprodurre il problema su 'PHP 5.3.10/GD 2.0', funzionante. Quali versioni stai usando? Potrebbe venire da qualcos'altro .. Ingresso PNG danneggiato? Come l'app per iPhone che carica un'immagine di cattiva qualità? Solo scatti nell'oscurità – Touki

+0

Ho provato questo su 'PHP 5.3.16-1 ~ dotdeb.0' (con Suhosin) con' GD 2.0.34' (compatibile 2.0.34) sulla mia scatola Debian, e quando ho eseguito 'imagepng 'le parti trasparenti erano nere. Questo è successo quando ho usato 'imagecreatefromstring' o' imagecreatefrompng'. –

+0

Sono in PHP 5.3.10/GD (compatibile con 2.0.34). – meustrus

risposta

5

Blech, questa si è rivelata in ultima analisi, a causa di una chiamata GD completamente separata che convalida i caricamenti di immagini. Ho dimenticato di aggiungere imagealphablending e imagesavealpha a quel codice, e stava creando una nuova immagine che poi è passata al codice di ridimensionamento. Quale dovrebbe probabilmente essere cambiato comunque. Grazie mille a goldenparrot per l'eccellente metodo di conversione di una stringa in un nome di file.

+0

tutto grazie vai a php-devs/\ – Prasanth

2

Devo assolutamente archiviare l'immagine come file (solo in modo che PHP possa caricarla di nuovo in memoria)?

No.

Documentation dice:

È possibile utilizzare il protocollo data:// da PHP V5.2.0

Esempio:

// prints "I love PHP" 
echo file_get_contents('data://text/plain;base64,SSBsb3ZlIFBIUAo='); 
+1

Dovresti essere in grado di fare '$ img = imagecreatefrompng ('data: // image/png; base64, '. $ base64Image); ' –

2

è possibile utilizzare questo codice:

$new = imagecreatetruecolor($width, $height); 

// preserve transparency 

imagecolortransparent($new, imagecolorallocatealpha($new, 0, 0, 0, 127)); 

imagealphablending($new, false); 

imagesavealpha($new, true); 

imagecopyresampled($new, $img, 0, 0, $x, 0, $width, $height, $w, $h); 

imagepng($new); 

imagedestroy($new); 

Farà un'immagine trasparente per voi. In bocca al lupo !

+1

Hai effettivamente letto la domanda o una qualsiasi delle risposte? – meustrus

+0

Questo ha messo tutto insieme per me. Grazie. –