AllesMeins: Thumbnails erstellen und Transparenz beibehalten

Hiho,

ich versuche mich gerade an einem kleinen Script das aus hochgeladenen Bildern thumbnails erstellt. das klappt auch wunderbar nur leider geht dabei transparenz von gifs bzw. pngs verloren. Wie muss ich das nachfolgende erweitern damit auch die Transparenz erhalten bleibt?

bilder.php (gekürzt):

================================
$pic_infos = getimagesize($_FILES['userfile']['tmp_name']);

/*Faktor ermitteln mit dem das Bild verkleinert werden muss damit es eine gewisse maximalgrösse ($max_breite bzw. $max_hoehe) nicht übersteigt*/

if($pic_infos[0] > $max_breite){
  $faktor_b = $max_breite / $pic_infos[0];
}

if($pic_infos[1] > $max_hoehe){
  $faktor_h = $max_hoehe / $pic_infos[1];
}
$faktor = min($faktor_h,$faktor_b);

/*Das eben hochgeladenen Bild zum bearbeiten öffnen*/
if($pic_infos[2] == 2){
  $source = imagecreatefromjpeg($_FILES['userfile']['tmp_name']);
} elseif($pic_infos[2] == 3) {
  $source = imagecreatefrompng($_FILES['userfile']['tmp_name']);
}  elseif($pic_infos[2] == 1) {
  $source = imagecreatefromgif($_FILES['userfile']['tmp_name']);
}

/*Zielbild generieren*/
$target = imagecreatetruecolor($pic_infos[0] * $faktor,$pic_infos[1] * $faktor);

/*Hochgeladenes Bild auf neues Bild verkleinert kopieren*/
  imagecopyresampled($target, $source, 0, 0, 0, 0, $pic_infos[0] * $faktor, $pic_infos[1] * $faktor, $pic_infos[0], $pic_infos[1]);

/*Abhängig vom Format der Quelldatei die Zieldatei schreiben*/
  if($pic_infos[2] == 2){
   imagejpeg($target, "news/images/" . $_FILES['userfile']['name']);
  } elseif($pic_infos[2] == 3) {
   imagepng($target, "news/images/" . $_FILES['userfile']['name']);
  }  elseif($pic_infos[2] == 1) {
   imagegif($target, "news/images/" . $_FILES['userfile']['name']);
  }

================================
Hmm, ist leider ziemlich viel Code geworden, aber mehr kann ich wohl schlecht rauskürzen. Ansonsten dürfte die Funktionsweise wohl nicht mehr klar werden. Ich hoffe irgendwer ist bereit sich das mal anzusehen und mir zu helfen...

Grüsse

Marc

  1. Sup!

    Du darfst einfach keine JPEG-Thumbnails erstellen, denn JPEG kann keine Transparenz. Voila!

    Gruesse,

    Bio

    --
    Keep your friends close, but your enemies closer!
    1. Moin!

      Sup!

      Du darfst einfach keine JPEG-Thumbnails erstellen, denn JPEG kann keine Transparenz. Voila!

      Genau deshalb steht doch ganz zum Schluß des Codes eine Abfrage drin, welches Originalformat vorlag, damit das Thumbnail im gleichen Format gespeichert wird.

      • Sven Rautenberg
  2. Moin!

    nur leider geht dabei transparenz von gifs bzw. pngs verloren. Wie muss ich das nachfolgende erweitern damit auch die Transparenz erhalten bleibt?

    http://de2.php.net/manual/en/function.imagealphablending.php
    http://de2.php.net/manual/en/function.imagesavealpha.php

    Alles klar?

    • Sven Rautenberg
    1. Hiho,

      danke für die Antwort. Leider will esnoch immer nicht so ganz... Ich habe jetzt nach dem $target = imagecreatetruecolor() ein

      imagealphablending ( $target, true );
      imagesavealpha($target, true);

      eingefügt. Hilft aber nichts ich erhalte immer noch nen schwarzen Rand anstatt der Transparenz (sowohlö bei gifs als auch bei pngs)...

      Marc

      1. Hallo!

        Setz mal bei
        imagealphablending ( $target, true );

        statt "true" ein "false".

        Gruß, Achim

        1. Hiho,

          ich habde den Eindruck wir nähern uns dem Ziel :) Jetzt funktioniert die Transparenz bei PNGs wunderbar - bei gifs leider noch nicht...

          Marc

          1. Hallo!

            bei GIFs habe ich das so gelöst (allerdings jetzt mit "meinen" Variablennamen, nicht mir Deinen...).

            $colorTransparent = imagecolortransparent($image);
            $newimage = imagecreate($width, $height);
            imagepalettecopy($newimage, $image);
            imagefill($newimage, 0, 0, $colorTransparent);
            imagecolortransparent($newimage, $colorTransparent);
            imagecopyresized($newimage, $image, 0, 0, 0, 0, $width, $height, $xwert, $ywert);

            Gruß, Achim

        2. Moin!

          Setz mal bei
          imagealphablending ( $target, true );

          statt "true" ein "false".

          Alphablending = true sorgt dafür, dass der Alphawert des Pixels mit dem Hintergrund zusammengerechnet wird zu einer Mischfarbe. Deshalb: Vorher ist der Hintergrund schwarz, der neue Pixel ist 100% transparent. Ergebnis: 100% schwarz.

          Mit Alphablending= false wird dieses Mischen abgeschaltet, die Transparenzinformation bleibt erhalten - genau das ist gewünscht.

          Steht so auch in der Doku zu imagesavealpha drin, btw. ;)

          "You have to unset alphablending (imagealphablending($im, FALSE)), to use it."

          • Sven Rautenberg