2013-06-07 17 views
10

Podczas zmiany rozmiaru png sprawdziłem, jak poprawnie zarządzać alfą. Udało mi się uzyskać przezroczystość, ale tylko dla pikseli, które są całkowicie przezroczyste. Oto mój kod:Zmiana rozmiaru obrazów z przezroczystością w php

$src_image = imagecreatefrompng($file_dir.$this->file_name); 
$dst_image = imagecreatetruecolor($this->new_image_width, $this->new_image_height); 
imagealphablending($dst_image, true); 
imagesavealpha($dst_image, true); 
$black = imagecolorallocate($dst_image, 0, 0, 0); 
imagecolortransparent($dst_image, $black); 
imagecopyresampled($dst_image, $src_image, 0, 0, 0, 0, $this->new_image_width, 
       $this->new_image_height, $this->image_width, $this->image_height); 
imagepng($dst_image, $file_dir.$this->file_name); 

Począwszy od tego obrazu źródłowego:

enter image description here

o zmienionym rozmiarze wygląda tak:

enter image description here

rozwiązanie dla niemal każdego forum postu Rozważaliśmy ten problem, powiedzmy, aby zrobić coś takiego:

imagealphablending($dst_image, false); 
$transparent = imagecolorallocatealpha($dst_image, 0, 0, 0, 127); 
imagefill($dst_image, 0, 0, $transparent); 

Wyniki tego kodu nie oszczędzając żadnego alfa w ogóle:

enter image description here

Czy istnieje inne rozwiązanie? Czy brakuje mi czegoś z mieszaniem alfa? Dlaczego ta praca dla wszystkich innych, ale dla mnie zawiodła? Używam MAMP 2.1.3 i PHP 5.3.15.

+0

możliwy duplikat [Jak zmienić rozmiar pngs z przezroczystością w PHP?] (Http://stackoverflow.com/questions/279236/how-do-i-resize-pngs-with-transparency-in-php) – Danack

+0

Próbowałem rozwiązań podanych w tym poście (i wielu innych). Oni w ogóle nie pracowali i nie jestem pewien dlaczego. – user2458399

Odpowiedz

-2

Użyłem klasy simpleImage do zmiany rozmiaru obrazu. Możesz zmienić rozmiar obrazu przy zachowaniu proporcji. ta klasa jest za pomocą imagecreatetruecolor i imagecopyresampled podstawowych funkcji PHP do ponownego rozmiar obrazu

$new_image = imagecreatetruecolor($width, $height); 
    imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight()); 
    $this->image = $new_image; 

znaleźć kompletny kod na http://www.white-hat-web-design.co.uk/blog/resizing-images-with-php/

+0

To nie jest pytanie, ale jest offtematem, ponieważ pytający jest specjalnie ukierunkowany na wbudowaną bibliotekę GD PHP ... (to powinien być komentarz, a nie odpowiedź) –

9
"They have not worked at all and I'm not sure why." 

Dobrze musi mieć robi coś złego. Kod z połączonych dwóch egzemplarzach, z kilkoma liniami dodany do załadowania i zapisać obraz:

$im = imagecreatefrompng(PATH_TO_ROOT."var/tmp/7Nsft.png"); 

$srcWidth = imagesx($im); 
$srcHeight = imagesy($im); 

$nWidth = intval($srcWidth/4); 
$nHeight = intval($srcHeight /4); 

$newImg = imagecreatetruecolor($nWidth, $nHeight); 
imagealphablending($newImg, false); 
imagesavealpha($newImg,true); 
$transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127); 
imagefilledrectangle($newImg, 0, 0, $nWidth, $nHeight, $transparent); 
imagecopyresampled($newImg, $im, 0, 0, 0, 0, $nWidth, $nHeight, 
    $srcWidth, $srcHeight); 

imagepng($newImg, PATH_TO_ROOT."var/tmp/newTest.png"); 

Tworzy obraz:

A resized PNG with transparency

czyli tego pytania (i odpowiedzi) są kompletne duplikat .

+0

Jaką macie platformę, wersję PHP/GD/Imagemagick? To jest prawdopodobnie przyczyna. Alternatywnie, przepełnienie stosu może ponownie przetwarzać obraz źródłowy, więc nie testujesz tego samego obrazu. – peterjwest

Powiązane problemy