2012-08-29 10 views
7

Ich habe versucht, Transparenz zu bekommen, um mit meiner Anwendung zu arbeiten (die Bilder dynamisch vor dem Speichern skaliert) und ich glaube, ich habe schließlich das Problem nach viel Irreführung über imagealphablending und imagesavealpha eingegrenzt. Das Quellbild wird niemals mit der richtigen Transparenz geladen!PHP GD imagecreatefromstring löscht Transparenz

// With this line, the output image has no transparency (where it should be 
// transparent, colors bleed out randomly or it's completely black, depending 
// on the image) 
$img = imagecreatefromstring($fileData); 
// With this line, it works as expected. 
$img = imagecreatefrompng($fileName); 

// Blah blah blah, lots of image resize code into $img2 goes here; I finally 
// tried just outputting $img instead. 

header('Content-Type: image/png'); 
imagealphablending($img, FALSE); 
imagesavealpha($img, TRUE); 
imagepng($img); 

imagedestroy($img); 

Es wäre eine ernsthafte architektonische Schwierigkeit, das Bild aus einer Datei zu laden; Dieser Code wird mit einer JSON-API verwendet, die von einer iPhone-App abgefragt wird, und in diesem Fall ist es einfacher (und konsistenter), Bilder als Base64-codierte Strings in die POST-Daten hochzuladen. Muss ich absolut brauchen, um das Bild irgendwie als Datei zu speichern (nur damit PHP es wieder in den Speicher laden kann)? Gibt es vielleicht eine Möglichkeit, einen Stream von $fileData zu erstellen, der an imagecreatefrompng übergeben werden kann?

+0

Kann das Problem auf 'PHP 5.3.10/GD 2.0' nicht reproduzieren, funktioniert gut. Welche Versionen verwendest du? Könnte von etwas anderem kommen .. Beschädigter PNG-Eintrag? Wie eine iPhone App, die ein Bild mit schlechter Qualität hochlädt? Just Shots im Dunkeln – Touki

+0

Ich testete dies auf 'PHP 5.3.16-1 ~ dotdeb.0' (mit Suhosin) mit' GD 2.0.34' (2.0.34 kompatibel) auf meiner Debian-Box, und als ich 'imagepng lief 'Die transparenten Teile waren schwarz. Dies passierte, wenn ich 'imagecreatefromstring' oder' imagecreatefrompng' verwendete. –

+0

Ich bin in PHP 5.3.10/GD (2.0.34 kompatibel). – meustrus

Antwort

5

Blech, das letztlich erwies sich als aufgrund eines völlig separaten GD-Aufrufs, der die Bilduploads validierte. Ich habe vergessen, imagealphablending und imagesavealpha zu diesem Code hinzuzufügen, und es wurde ein neues Bild erstellt, das dann an den Größenänderungscode übergeben wurde. Was wohl sowieso geändert werden sollte. Vielen Dank an goldenparrot für die ausgezeichnete Methode, einen String in einen Dateinamen umzuwandeln.

+0

alles dank an php-devs/\ – Prasanth

2

Muss ich das Bild irgendwie als Datei speichern (nur damit PHP es wieder in den Speicher laden kann)?

Nr

Documentation sagt:

Sie data:// Protokoll von PHP V5.2.0 verwenden können

Beispiel:

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

Sie sollten in der Lage zu tun '$ img = imagecreatefrompng ('Daten: // image/png; base64, '. $ base64Image); ' –

2

können Sie diesen Code verwenden:

$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); 

Es wird für Sie ein transparentes Bild machen. Viel Glück !

+1

Hast du tatsächlich die Frage oder eine der Antworten gelesen? – meustrus

+0

Das hat alles für mich zusammengefügt. Vielen Dank. –