Poniższy fragment kodu PHP używa GD do zmiany rozmiaru pliku PNG przesłanego do przeglądarki na 128x128. Działa świetnie, poza tym, że przezroczyste obszary na oryginalnym obrazie są zastępowane jednolitym kolorem - w moim przypadku czarnym.
Chociaż imagesavealpha
jest ustawione, coś jest nie tak.
Jaki jest najlepszy sposób na zachowanie przezroczystości ponownie próbkowanego obrazu?
$uploadTempFile = $myField[ 'tmp_name' ]
list( $uploadWidth, $uploadHeight, $uploadType )
= getimagesize( $uploadTempFile );
$srcImage = imagecreatefrompng( $uploadTempFile );
imagesavealpha( $targetImage, true );
$targetImage = imagecreatetruecolor( 128, 128 );
imagecopyresampled( $targetImage, $srcImage,
0, 0,
0, 0,
128, 128,
$uploadWidth, $uploadHeight );
imagepng( $targetImage, 'out.png', 9 );
alphablending = false
tu ważne? Dokument stwierdza, że ... „Aby z niego skorzystać, musisz wyłączyć ustawienie alphablending (imagealphablending($im, false)
)”.imagecreatefrompng()
sugeruje, żeimagealphablending
należy ją ustawićtrue
, co jest ewidentnie błędne. Dziękuję bardzo.Dlaczego tak komplikujesz sprawy? Oto, czego używam i jak dotąd spełniło to za mnie zadanie.
źródło
Uważam, że to powinno załatwić sprawę:
edycja: Ktoś w oświadczeniach PHP docs
imagealphablending
powinien być prawdziwy, a nie fałszywy. YMMV.źródło
imagealphablending
zarówno wartości true, jak i false, zawsze mam czarne tło.Dodatek, który może pomóc niektórym osobom:
Podczas budowania obrazu możliwe jest przełączanie blokowania obrazu. W konkretnym przypadku, gdy tego potrzebowałem, chciałem połączyć kilka półprzezroczystych plików PNG na przezroczystym tle.
Najpierw ustaw imagealphablending na false i wypełnij nowo utworzony obraz w prawdziwych kolorach przezroczystym kolorem. Gdyby blokowanie obrazu było prawdziwe, nic by się nie wydarzyło, ponieważ przezroczyste wypełnienie połączyłoby się z czarnym domyślnym tłem i dałoby czarny kolor.
Następnie przełączasz imagealphablending na true i dodajesz obrazy PNG do płótna, pozostawiając część tła widoczną (tj. Nie wypełniając całego obrazu).
W rezultacie otrzymujemy obraz z przezroczystym tłem i kilkoma połączonymi obrazami PNG.
źródło
Stworzyłem funkcję zmiany rozmiaru obrazu, takiego jak JPEG / GIF / PNG,
copyimageresample
a obrazy PNG nadal zachowują przezroczystość:źródło
$transparent = imagecolorallocatealpha($tmp, 255, 255, 255, 127);
imagefilledrectangle($tmp, 0, 0, $newwidth, $newheight, $transparent);
Przypuszczam, że to może załatwić sprawę:
Wadą jest to, że obraz zostanie pozbawiony każdego 100% zielonych pikseli. Tak czy inaczej, mam nadzieję, że to pomoże :)
źródło
imagecreate(...)
zadziałało. Tworzysz obraz, który zostaje wypełniony pierwszym przydzielonym kolorem. Następnie ustawiasz ten kolor na przezroczysty. Jeśli ustawienie alphablending ma wartość true dla obrazu docelowego, oba obrazy zostaną scalone, a przezroczystość będzie działać poprawnie.Odnosząc się do zachowania przezroczystości, to tak, jak podano w innych postach, imagesavealpha () musi być ustawione na true, aby użyć flagi alfa, imagealphablending () musi być ustawione na false, w przeciwnym razie nie będzie działać.
W twoim kodzie zauważyłem również dwie drobne rzeczy:
getimagesize()
aby uzyskać szerokość / wysokośćimagecopyresmapled()
$uploadWidth
i$uploadHeight
powinna być-1
wartością, ponieważ serie koordynacyjne zaczynają się od0
a nie1
, więc skopiowałaby je do pustego piksela. Zastąpienie go:imagesx($targetImage) - 1
iimagesy($targetImage) - 1
, względnie powinno wystarczyć :)źródło
Oto mój całkowity kod testowy. Mi to pasuje
źródło
Zwróć uwagę na obraz źródłowy
width
iheight
wartości, które są przekazywane doimagecopyresampled
funkcji. Jeśli są większe niż rzeczywisty rozmiar obrazu źródłowego, reszta obszaru obrazu zostanie wypełniona czarnym kolorem.źródło
Połączyłem odpowiedzi od ceejayoz i Cheekysoft, co dało dla mnie najlepszy wynik. Bez imagealphablending () i imagesavealpha () obraz nie jest wyraźny:
źródło