Gemakkelijk miniaturen maken met GD Library

Door 24 juli 2013Tips & Trucs

Op het internet zijn tal van scripts te vinden om miniaturen te maken. Na een speurtocht uiteindelijk gekozen zelf een functie hiervoor te schrijven met de volgende functionaliteiten cq vereisten:

  • Zowel de hoogte als de breedte in kunnen stellen
  • De miniatuur dient altijd gevuld te zijn, wanneer de verhouding dus niet gelijk is dient er wat afgesneden te worden
  • Gemakkelijk in gebruik, waaronder de afbeelding extensie niet op te hoeven geven
  • Eventueel meerdere formaten miniaturen te maken, dus een bestandsnaam met de grootte erin zodat deze niet overschreven worden

Dit heeft het volgende resultaat opgeleverd:

<?php
/**
 * Create thumbnail (resize and/or crop image)
 * @param  string  $image  Source image
 * @param  integer $width  Thumbnail width
 * @param  integer $height Thumbnail height
 * @return string          The generated thumbnail
 */
function thumb($image,$width = 200,$height = 200)
{
	// Image set?
	if($image)
	{
		// Get the file information
		$fileinfo = pathinfo($image);

		// Set the thumbnail location
		$image_thumb = $fileinfo['dirname'] . '/thumb/' . $width . '-' . $fileinfo['basename'];

		// Thumbnail already exists?
		if(!file_exists($image_thumb))
		{
			// Get source as image
			$image = imagecreatefromstring(file_get_contents($image));

			// Set new size
			$thumb_width 		= $width;
			$thumb_height 		= $height;

			// Get image size
			$width 				= imagesx($image);
			$height 			= imagesy($image);

			// Calculate ratio
			$original_aspect 	= $width / $height;
			$thumb_aspect 		= $thumb_width / $thumb_height;

			// Image wider than new size?
			if ( $original_aspect >= $thumb_aspect )
			{
				$new_height 	= $thumb_height;
				$new_width 		= $width / ($height / $thumb_height);
			}
			// New size wider than the image
			else
			{
				$new_width 		= $thumb_width;
				$new_height 	= $height / ($width / $thumb_width);
			}

			// Create new image
			$thumb = imagecreatetruecolor( $thumb_width, $thumb_height );

			// Resize and crop
			imagecopyresampled($thumb,
									$image,
									0 - ($new_width - $thumb_width) / 2, // Center the image horizontally
									0 - ($new_height - $thumb_height) / 2, // Center the image vertically
									0, 0,
									$new_width, $new_height,
									$width, $height);

			// Create and return image
			imagejpeg($thumb,$image_thumb);

			// Destroy
			imagedestroy($thumb);
		}

		// Return the thumbnail
		return $image_thumb;
	}
	else
	{
		// Set a placeholder
		return 'http://placehold.it/'.$width.'x'.$height;
	}
}
?>

Tevens wordt er al gecontroleerd of de miniatuur al gemaakt is, hierdoor kan deze eventueel direct aangesproken worden door de functie te koppelen aan GET variabelen:

<?php
if($_GET['thumb'])
{
	echo thumb($_GET['thumb'],200,200);
}
?>

Wat vervolgens op de volgende manier gebruikt kan worden:

<img src="file.php?thumb=source-image.jpg" alt="">

Deze functie wordt onder andere gebruikt in een advertentie systeem en op Fastr, een nieuw platform voor autoliefhebbers!