Inhaltsverzeichnis

Bild verkleinern (PHP)

Beschreibung

Dieses kleine PHP-Script erzeugt eine verkleinerte Version eines Bildes. Dabei kann es sich um jeden Dateityp handeln, mit dem die GD-Library umgehen kann.

Benutzung

Die Funktion wird aufgerufen mit:

Wenn die Erzeugung des Bildes nicht funktioniert, wird eine Exception geworfen. Diese sollte man abfangen und entsprechend behandeln.

Beispiel

try {
  createResizedImage('path/to/source_image.gif',
                     200,
                     150,
                     'thumbnails/thumb_1.png');
}
catch (Exception e) {
  echo 'An error occured during thumbail generation: ', $e->getMessage();
}

Code

/**
 * Creates a resized version of a given image file.
 * Can handle all file types GD is able to read. It will attempt to resize the image
 * so that it fits both given maximum values for width and height. The image never
 * will be stretched.
 * If an output file is specified, the new image will be stored in this file.
 * The output will always be a PNG image!
 * If no output file is specified, the functions sets the needed headers and directly
 * send the image to the browser.
 *
 * Usage:
 *   try {
 *     createResizedImage('path/to/source_image.gif',
 *                        200,
 *                        150,
 *                        'thumbnails/thumb_1.png');
 *   }
 *   catch (Exception e) {
 *     echo 'An error occured during thumbail generation: ', $e->getMessage();
 *   }
 *
 * @param   path        Path to the source image file
 * @param   width       Maximum width for the new image
 * @param   height      Maximum height for the new image
 * @param   outfile     File to which the new image should be written, optional
 *
 * @throws  If there are any problems reading the file or writing the output file, an
 *          exception will be thrown.
 */
 
function createResizedImage($path, $width, $height, $outfile = false)
{
  // Check the given values for errors
  if (!file_exists($path))
    throw new Exception("File '".$path."' doesn't exist!");
  if (!$size = @getimagesize($path))
    throw new Exception("Could not obtain image dimensions for '".$path."'!");
  if (!is_numeric($width) || !is_numeric($height) || ($width < 1) || ($height < 1))
  {
    trigger_error("createResizedImage() expects second and third parameter to be a number greater 1!", E_USER_ERROR);
    break;
  }
 
  // Load the source image
  switch ($size[2]) {
    case 1:
      $src_img = @imagecreatefromgif($path);
      break;
    case 2:
      $src_img = @imagecreatefromjpeg($path);
      break;
    case 3:
      $src_img = @imagecreatefrompng($path);
      break;
    default:
      throw new Exception("Image '".$path."' is of an unknown type and cannot be read!");
  }
  if (!$src_img)
    throw new Exception("Image '".$path."' could not be read!");
 
  // Calculate new image dimensions
  $new_width = $size[0];
  $new_height = $size[1];
  if (($size[0] > $width) || ($size[1] > $height))
  {
    if (($size[0] - $width) > ($size[1] - $height))
    {
      $new_width = $width;
      $new_height = $size[1] * ($new_width / $size[0]);
    }
    else 
    {
      $new_height = $height;
      $new_width = $size[0] * ($new_height / $size[1]);
    }
  }
 
  // Create new image
  $new_img = imagecreatetruecolor($new_width, $new_height);
  if (function_exists('imagecopyresampled'))
    imagecopyresampled($new_img, $src_img, 0, 0, 0, 0, $new_width, $new_height, $size[0], $size[1]);
  else
    imagecopyresized($new_img, $src_img, 0, 0, 0, 0, $new_width, $new_height, $size[0], $size[1]);
 
  // Send image to browser or write it to the output file
  if (!$outfile)
  {
    @header("Content-Type: image/png");
    imagepng($new_img);
  }
  else
  {
    if (!is_writeable(dirname($outfile)))
      throw new Exception("The output file '".$outfile."' is not writeable!");
    if (!imagepng($new_img, $outfile))
      throw new Exception("The new image could not be written to '".$outfile."'!");
  }
 
  // Clean up
  imagedestroy($src_img);
  imagedestroy($new_img);
}