2013-06-07 8 views
10

Ich habe überall nach wie Alpha richtig zu verwalten, wenn ich die Größe eines PNG ändern. Ich habe es geschafft, Transparenz zu schaffen, aber nur für Pixel, die komplett transparent sind. Hier ist mein Code:Größe der Bilder mit Transparenz in 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); 

Beginnend mit dieser Quelle Bild:

enter image description here

Das skalierte Bild sieht wie folgt aus:

enter image description here

Die Lösung für fast jedem Forum Post I Habe mir zu diesem Thema etwas angesehen, sagen wir mal so:

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

Die Ergebnisse aus diesem Code nicht überhaupt jede Alpha zu retten: Gibt es

enter image description here

eine andere Lösung? Fehle ich etwas mit dem Alpha-Blending? Warum sollte das für alle anderen funktionieren, aber völlig fehlschlagen für mich? Ich benutze MAMP 2.1.3 und PHP 5.3.15.

+0

mögliche Duplikate von [Wie skaliere ich PNGs mit Transparenz in PHP?] (Http://stackoverflow.com/questions/279236/how-do-i-resize-pngs-with-transparency-in-php) – Danack

+0

Ich habe die in diesem Beitrag (und vielen anderen) gegebenen Lösungen ausprobiert. Sie haben überhaupt nicht funktioniert und ich bin mir nicht sicher warum. – user2458399

Antwort

-2

Ich habe die SimpleImage-Klasse für die Bildgrößenänderung verwendet. Sie können das Bild unter Beibehaltung des Seitenverhältnisses neu skalieren. diese Klasse wird mit und imagecreatetruecolor imagecopyresampled Funktionen Kern Php Größe neu Bild

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

finden vollständigen Code bei http://www.white-hat-web-design.co.uk/blog/resizing-images-with-php/

+0

Dies ist keine Frage, aber es ist offtopic, da asker speziell auf die in PHP integrierte GD-Bibliothek abzielt ... (dies sollte ein Kommentar sein, keine Antwort) –

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

Nun, Sie etwas falsch getan haben muss. Der Code aus dem verknüpften Duplikat mit einem paar Zeilen hinzugefügt, um das Bild zu laden und speichern:

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

Erzeugt das Bild:

A resized PNG with transparency

dh diese Frage (und Antwort) ist ein komplettes Duplikat .

+0

Welche Plattform, Version von PHP/GD/Imagemagick haben Sie beide? Dies ist wahrscheinlich die Ursache. Alternativ könnte der Stapelüberlauf das Quellbild erneut verarbeiten, damit Sie nicht dasselbe Bild testen. – peterjwest