2008-11-23 16 views
43

Hej, masz problem z zachowaniem przezroczystości na png, gdy tworzę miniaturę, czy ktoś ma z tym jakieś doświadczenie? każda pomoc byłaby świetna, oto, co aktualnie robię:Przejrzystość PNG z PHP

$fileName= "../js/ajaxupload/tees/".$fileName; 

list($width, $height) = getimagesize($fileName); 

$newwidth = 257; 
$newheight = 197; 

$thumb = imagecreatetruecolor($newwidth, $newheight); 
imagealphablending($thumb, true); 
$source = imagecreatefrompng($fileName); 
imagealphablending($source, true); 

imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); 

imagesavealpha($thumb, true); 
imagepng($thumb,$newFilename); 

Odpowiedz

81

miałem sukces robi to w ten sposób w przeszłości:

$thumb = imagecreatetruecolor($newwidth, $newheight); 
imagealphablending($thumb, false); 
imagesavealpha($thumb, true); 

$source = imagecreatefrompng($fileName); 
imagealphablending($source, true); 

imagecopyresampled($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); 

imagepng($thumb,$newFilename); 

znalazłem jakość obrazu wyjściowego znacznie lepszego wykorzystania imagecopyresampled() niż imagecopyresized()

+0

, który to pękł! bardzo zobowiązany! – BastardPrince

+1

To nie działa dla mnie :( – 2by

+0

+1 dziękuję, pracował dla mnie –

1

Zobacz dycey's answer to "How do I resize...". Zasadniczo, zanim wykonasz jakiekolwiek inne operacje, musisz wypełnić całe tło przezroczystością.

+0

To pytanie wciąż pozostaje bez odpowiedzi. Być może jednak oba muszą zostać połączone. – strager

2

nie obsługuje poprawnie przezroczystości.

imagecopymerge ma, ale nie zmienia rozmiaru.

Rozwiązanie? Prawdopodobnie zmieniłbyś rozmiar ręcznie.

2

Funkcje te dostęp do podstawowych biblioteki GDlib, który jest dobra zabawka, ale nie jest to coś, co daje dobre rezultaty. Jeśli masz taką możliwość, użyj zamiast tego imagemagick. Minusem jest to, że obecnie nie ma dobrych powiązań php, więc musisz uzyskać do niego dostęp przez powłokę, której zazwyczaj nie masz na współdzielonych hostach.

13

Zapomnij o wskaźniku przezroczystości kolorów, nigdy nie działa we wszystkich produktach renderujących. Zamiast tego użyj maski warstwy alfa:

$image = imagecreatetruecolor($size, $size); 

imagealphablending($image, false); 
imagesavealpha($image, true); 

$trans_layer_overlay = imagecolorallocatealpha($image, 220, 220, 220, 127); 
imagefill($image, 0, 0, $trans_layer_overlay); 
+0

Awesome! Zmarnowałeś ponad godzinę, aby to zrozumieć, a Twoje rozwiązanie jest jedyne! –

+0

Doskonały niż kiedykolwiek !. Jesteś świetnym człowiekiem @ user629089. Bardzo dziękuję – rasputin

+3

Czy możesz wyjaśnić, dlaczego użyłeś '220, 220, 220 '? –

Powiązane problemy