gif's und jpg's automatisch verkleinen und neu abspeichern

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Benutzeravatar
konne
Mitglied
Beiträge: 250
Registriert: 26.08.2004 15:30
Kontaktdaten:

gif's und jpg's automatisch verkleinen und neu abspeichern

Beitrag von konne »

Habe mir für dieses Vorhaben folgemden Quelltext herangezoge

Code: Alles auswählen

<?PHP
function img_resize($path,$w=0,$h=0,$quality=100,$save='') {
//  echo('Breit: '.$image_data[0].' | Hoch: '.$image_data[1].' | Typ: '.$image_data[2].' | Mime: '.$image_data['mime']);
  $image_data = @getimagesize($path);
  $image_type = $image_data[2];
  $gd_ext = array('','jpg','gif');
  if ($image_type != 1 && $image_type != 2)
    return false;
  if ($save == '')
    header('Content-type: '.$image_data['mime']);
  else
    $save = eregi_replace('%ext',$gd_ext[$image_type],$save);
  if ($w != 0) {
//    echo(' Breite angegeben ');
    $rapporto = $image_data[0] / $w;
    if ($h != 0) {
//      echo(' Höhe angegeben ');
      if ($image_data[1] / $rapporto > $h)
        $rapporto = $image_data[1] / $h;
    }
  }
  elseif ($h != 0) {
//    echo(' NUR Höhe angegeben ');
    $tmp_h = $image_data[1] / $h;
  }
  else {
//    echo(' Keine Größen angegeben ');
    return false;
  }
  $thumb_w = $image_data[0] / $rapporto;
  $thumb_h = $image_data[1] / $rapporto;
  if ($image_type == 1)
    $img_src = @imagecreatefromgif($path);
  elseif ($image_type == 2)
    $img_src = @imagecreatefromjpeg($path);
  $img_thumb = @imagecreatetruecolor($thumb_w,$thumb_h);
  $result = @imagecopyresampled($img_thumb,$img_src,0,0,0,0,$thumb_w,$thumb_h,$image_data[0],$image_data[1]);
  if (!$img_src || !$img_thumb || !$result)
    return false;
  if ($image_type == 1)
    $result = @imagegif($img_thumb,$save);
  elseif ($image_type == 2)
    $result = @imagejpeg($img_thumb,$save,$quality);
  return $result;
}
?>
Der stammt von http://www.php3.de/ImageCopyResampled und ist nur leicht mit Kommentaren von mir aufgefüllt worden.
Diesen habe ich in einer Datei namens resize.php abgespeichert.
Wie kann ich nun aber die Funktion nutzen?
Beim Test in der gleichen Datei Thumbs auszugeben mit

Code: Alles auswählen

img_resize('fsv_rassnitz.gif',30,30,100,'')
funktionieren nur jpg's und außerdem kein HTML oder sonstiges.
In andere Datei mit include und echo gehts scheinbar gar nicht.
Das Speichern will so oder so nicht funktionieren.
mristau2k5
Mitglied
Beiträge: 140
Registriert: 10.05.2005 02:35
Wohnort: Filderstadt

Beitrag von mristau2k5 »

Also ich benutze folgende Funktion:

Code: Alles auswählen

$img_dir = "./images/gallery/";
$thumb_dir = "./images/gallery/thumb/";

function make_thumbnail($bild)
{
  // globale Variablen, weil sie im Skript auch außerhalb benutzt werden
  global $img_dir, $thumb_dir;
  
  // Bilddaten feststellen
  $size=getimagesize($img_dir.$bild);
  $breite=$size[0];
  $hoehe=$size[1];
  $neueBreite=125;
  $neueHoehe=intval($hoehe*$neueBreite/$breite);

  // wenn ein Thumbnail existiert keins erstellen, ansonsten erstellen
  // wenn man die Breite ändert muss man bisher die Thumbnails löschen
  // damit neue erstellt werden
  if (!file_exists($thumb_dir."thumb_".$bild))
  {
    switch($size[2])
    {
      case 1: // GIF
        $altesBild=ImageCreateFromGIF($img_dir.$bild);
        $neuesBild=ImageCreateTrueColor($neueBreite,$neueHoehe);
        ImageCopyResized($neuesBild,$altesBild,0,0,0,0,
        $neueBreite,$neueHoehe,$breite,$hoehe);
        ImageGIF($neuesBild,$thumb_dir."thumb_".$bild);
        break;
      case 2: // JPG
        $altesBild=ImageCreateFromJPEG($img_dir.$bild);
        $neuesBild=ImageCreateTrueColor($neueBreite,$neueHoehe);
        ImageCopyResized($neuesBild,$altesBild,0,0,0,0,
        $neueBreite,$neueHoehe,$breite,$hoehe);
        ImageJPEG($neuesBild,$thumb_dir."thumb_".$bild);
        break;
      case 3: // PNG
        $altesBild=ImageCreateFromPNG($img_dir.$bild);
        $neuesBild=ImageCreateTrueColor($neueBreite,$neueHoehe);
        ImageCopyResized($neuesBild,$altesBild,0,0,0,0,
        $neueBreite,$neueHoehe,$breite,$hoehe);
        ImagePNG($neuesBild,$thumb_dir."thumb_".$bild);
        break;
     }
  }
  // Ausgabe direkt im <img>-Tag  
  $thumbnail = "<img src=".$thumb_dir."thumb_".$bild." width=".$neueBreite." height=".$neueHoehe.">";

  return $thumbnail;
}

// Benutzung mit echo make_thumbnail("bildname.bildendung");
wichtig ist, dass das Verzeichnis für die Thumbnails per CHMOD auf 777 gesetzt wird
Benutzeravatar
konne
Mitglied
Beiträge: 250
Registriert: 26.08.2004 15:30
Kontaktdaten:

Beitrag von konne »

Die sieht auch nicht schlecht aus. Es gibt nur Probleme bei Transparenz, die wird im Thumb schwarz gesetzt.
Ist das nur bei mir der Fall oder generell so. Kann man dagegen was machen machen (z.B. Transparenz --> weiß)?
Benutzeravatar
konne
Mitglied
Beiträge: 250
Registriert: 26.08.2004 15:30
Kontaktdaten:

Beitrag von konne »

Habe es mal für die GIFs damit probiert:

Code: Alles auswählen

      case 1: // GIF
        $altesBild = ImageCreateFromGIF($img_dir.$bild);
        $neuesBild = ImageCreate($neueBreite,$neueHoehe);
        $background_color = ImageColorAllocate ($neuesBild, 255, 255, 255);
        ImageCopyResized($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe);
        ImageGIF($neuesBild,$thumb_dir.$bild);
        break;
also ohne TrueColor, aber dafür mit background_color. Damit ist der Hintergrund anschließend Weiß.

Sowohl bei der Nutzung von ImageCreate() als auch ImageCreateTrueColor() bin ich nicht ganz so mit der Qualität zufrieden (Verkleinerung von 90x90px auf 60x60px), wie ich es von PSP oder anderen Grafikprogrammen gewohnt bin.

Gibt es noch Schrauben, die ich nicht kenne, an denen man noch etwas stellen kann, um die Qualität zu verbessern?

Bei PSP handle ich das sonst immer so, dass die Farbtiefe der GIFs erhöht wird, anschließend das Bild verkleinert und am Ende die Farbtiefe wieder auf 256 heruntergesetzt wird. Kann man das so oder so etwa auch mit php hinbekommen?
Antworten

Zurück zu „Coding & Technik“