2012-08-29 13 views
7

Próbowałem uzyskać przezroczystość do pracy z moją aplikacją (która dynamicznie zmienia rozmiar obrazów przed ich zapisaniem) i myślę, że w końcu zawęziłem problem po wielu błędach dotyczących imagealphablending i imagesavealpha. Obraz źródłowy nigdy nie jest ładowany z odpowiednią przezroczystością!PHP GD imagecreatefromstring discards transparency

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

Byłby to poważny problem architektoniczny, aby załadować obraz z pliku; kod ten jest używany z interfejsem API JSON, który jest pobierany z aplikacji na telefon iPhone i łatwiej jest w tym przypadku (i bardziej spójnie) przesłać obrazy jako łańcuchy kodowane base64 w danych POST. Czy absolutnie trzeba, aby jakoś przechowywać obraz jako plik (tak, aby PHP mógł ponownie załadować go do pamięci)? Czy istnieje sposób na utworzenie strumienia z $fileData, który można przekazać do imagecreatefrompng?

+0

Nie można odtworzyć problemu w "PHP 5.3.10/GD 2.0", działa poprawnie. Z jakich wersji korzystasz? Może pochodzić z czegoś innego .. Uszkodzono wpis PNG? Podobnie jak w przypadku aplikacji do iPhone'a, które ładują obraz o złej jakości? Po prostu strzały w ciemności – Touki

+0

Przetestowałem to na 'PHP 5.3.16-1 ~ dotdeb.0' (z Suhosin) z' GD 2.0.34' (2.0.34 kompatybilnym) na moim pudełku Debiana i kiedy uruchomiłem 'imagepng 'przezroczyste części były czarne. Stało się tak, gdy użyłem 'imagecreatefromstring' lub' imagecreatefrompng'. –

+0

Jestem w PHP 5.3.10/GD (zgodny z 2.0.34). – meustrus

Odpowiedz

5

Blech, okazało się ostatecznie ze względu na całkowicie oddzielne połączenie GD, które walidowało przesyłanie obrazów. Zapomniałem dodać imagealphablending i imagesavealpha do tego kodu, i to było tworzenie nowego obrazu, który następnie został przekazany do kodu zmiany rozmiaru. Który prawdopodobnie i tak powinien zostać zmieniony. Wielkie dzięki dla Goldenparrot za doskonałą metodę konwersji ciągu znaków do nazwy pliku.

+0

Wszystkie podziękowania dla php-devs/\ – Prasanth

2

Czy muszę koniecznie zachować plik jako plik (tak, aby PHP mogło ponownie załadować go do pamięci)?

nr

Documentation mówi:

Można użyć data:// protokół z PHP v5.2.0

Przykład:

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

Powinieneś być w stanie zrobić '$ img = imagecreatefrompng ('data: // image/png; base64, '. $ base64Image); ' –

2

można użyć tego kodu:

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

To sprawi, przezroczysty obraz dla ciebie. Powodzenia !

+1

Czy rzeczywiście przeczytałeś pytanie lub jedną z odpowiedzi? – meustrus

+0

To wszystko ułożyło dla mnie. Dzięki. –

Powiązane problemy