(GD) Thumbnails von PNGs mit Alpha-Kanal
Julian von Mendel
- php
Hallo Welt,
ich habe mir eine Klasse zum Thumbnailen geschrieben. Die geht gut. Nur bei PNGs mit Alpha-Kanal gibts Probleme, weil alles mit Alpha nach dem Resizen schwarz ist. Hab also ein wenig rumgesucht und die Funktion imagesavealpha gefunden, mit der das gehen soll. Habe alles gemacht was in der Doku steht, zuvor alphablendig ausgeschaltet und meine GD-Version überprüft.
$this->image_handler = imagecreatefrompng($this->image_path);
imagealphablending($this->image_handler,false);
imagesavealpha($this->image_handler,true);
...zeugs zum resizen...
imageinterlace($this->image_handler);
return(imagepng($this->image_handler,$destination,$quality));
Geht aber nicht. Hat exakt nichts geändert. Ich dachte dass es vielleicht was mit dem Interlace zu tun hat, aber wenn man das weg macht gehts auch nicht besser. Hat jemand einen Tipp, was ich falsch mache?
Schöne Grüße
Julian
Hi,
ich hab bald den ganzen Google-Index durch und find nix. Ich kann doch nicht der erste sein, der möchte, dass die Transparenz beim Resizen nicht verloren geht?!
Schöne Grüße
Julian
Hi Julian!
ich hab bald den ganzen Google-Index durch und find nix.
Und wieso schaust du dann nicht im Archiv nach? :)
PNG mit Alphatransparenz skalieren
MfG H☼psel
Hi,
Und wieso schaust du dann nicht im Archiv nach? :)
wie meine Fragestellung schon im Betreff erwähnt, suche ich nach einer Lösung unter Verwendung von GD. Nicht jeder hat Imagemagick auf seinem Server zur Verfügung.
Schöne Grüße
Julian
Hi,
$this->image_handler = imagecreatefrompng($this->image_path);
imagealphablending($this->image_handler,false);
imagesavealpha($this->image_handler,true);
...zeugs zum resizen...
imageinterlace($this->image_handler);
return(imagepng($this->image_handler,$destination,$quality));
der entscheidende Abschnitt stand hier gar nicht drin: das neu erstellte kleinere Bild beim Resizen muss erstens ebenfalls mit imagealphablending() und imagesavealpha() behandelt werden und zweitens muss es mit einer einheitlichen Hintergrundfarbe gefüllt werden, die dann per imagecolortransparent() komplett durchscheinend gemacht wird. Dann kopiert man per imagecopyresampled() das große Bild in das kleine rein. Mein primärer Fehler war also, dass ich vergessen hatte, die Hintergrundfarbe vom kleinen neu erstellen Bild als transparent zu markieren - ich dachte die Transparenz vom Großen wird mit drüber kopiert. Mein Code sieht jetzt so aus: (gekürzt)
~~~php
> $this->image_handler = imagecreatefrompng($this->image_path);
> imagealphablending($this->image_handler,false);
> imagesavealpha($this->image_handler,true);
$image_handler = imagecreatetruecolor($width,$height);
imagealphablending($image_handler,false);
imagesavealpha($image_handler,true);
imagepalettecopy($image_handler,$this->image_handler);
$transparent = imagecolorallocate($image_handler,0,0,0);
imagefill($image_handler,0,0,$transparent);
imagecolortransparent($image_handler,$transparent);
imagecopyresampled
(
$image_handler ,
$this->image_handler,
0,0,0,0 ,
$width ,
$height ,
$this->image_width ,
$this->image_height
);
$this->image_handler = $image_handler;
> imageinterlace($this->image_handler);
> return(imagepng($this->image_handler,$destination,$quality));
Schöne Grüße
Julian