Julian von Mendel: (GD) Thumbnails von PNGs mit Alpha-Kanal

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

--
"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning." - Rich Cook
http://derjulian.net
  1. 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

    1. 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

      --
      "It's amazing I won. I was running against peace, prosperity, and incumbency."
      George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
      Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
      1. Hi,

        Und wieso schaust du dann nicht im Archiv nach? :)

        PNG mit Alphatransparenz skalieren

        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

  2. 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