Dernière mise à jour: lun 5 juil 2010

imagethumb()

(PHP 4 >= 4.0.6, PHP 5)

Envoie la miniature d'une image vers un navigateur ou un fichier.

imagethumb() génère une copie de l'image image_src aux dimensions maximales max_size et l'envoie vers un navigateur ou le fichier image_dest.
imagethumb() utilise la bibliothèque GD et retournera FALSE si celle-ci n'est pas disponible
imagethumb() fonctionne correctement avec les images de type Jpeg, Png et Gif. Dans le cas d'un Gif animé, seule la première frame sera utilisé.
imagethumb() gère la transparence.

Source

<?php

function imagethumb( $image_src , $image_dest = NULL , $max_size = 100, $expand = FALSE, $square = FALSE )
{
	if( !file_exists($image_src) ) return FALSE;

	// Récupère les infos de l'image
	$fileinfo = getimagesize($image_src);
	if( !$fileinfo ) return FALSE;

	$width     = $fileinfo[0];
	$height    = $fileinfo[1];
	$type_mime = $fileinfo['mime'];
	$type      = str_replace('image/', '', $type_mime);

	if( !$expand && max($width, $height)<=$max_size && (!$square || ($square && $width==$height) ) )
	{
		// L'image est plus petite que max_size
		if($image_dest)
		{
			return copy($image_src, $image_dest);
		}
		else
		{
			header('Content-Type: '. $type_mime);
			return (boolean) readfile($image_src);
		}
	}

	// Calcule les nouvelles dimensions
	$ratio = $width / $height;

	if( $square )
	{
		$new_width = $new_height = $max_size;

		if( $ratio > 1 )
		{
			// Paysage
			$src_y = 0;
			$src_x = round( ($width - $height) / 2 );

			$src_w = $src_h = $height;
		}
		else
		{
			// Portrait
			$src_x = 0;
			$src_y = round( ($height - $width) / 2 );

			$src_w = $src_h = $width;
		}
	}
	else
	{
		$src_x = $src_y = 0;
		$src_w = $width;
		$src_h = $height;

		if ( $ratio > 1 )
		{
			// Paysage
			$new_width  = $max_size;
			$new_height = round( $max_size / $ratio );
		}
		else
		{
			// Portrait
			$new_height = $max_size;
			$new_width  = round( $max_size * $ratio );
		}
	}

	// Ouvre l'image originale
	$func = 'imagecreatefrom' . $type;
	if( !function_exists($func) ) return FALSE;

	$image_src = $func($image_src);
	$new_image = imagecreatetruecolor($new_width,$new_height);

	// Gestion de la transparence pour les png
	if( $type=='png' )
	{
		imagealphablending($new_image,false);
		if( function_exists('imagesavealpha') )
			imagesavealpha($new_image,true);
	}

	// Gestion de la transparence pour les gif
	elseif( $type=='gif' && imagecolortransparent($image_src)>=0 )
	{
		$transparent_index = imagecolortransparent($image_src);
		$transparent_color = imagecolorsforindex($image_src, $transparent_index);
		$transparent_index = imagecolorallocate($new_image, $transparent_color['red'], $transparent_color['green'], $transparent_color['blue']);
		imagefill($new_image, 0, 0, $transparent_index);
		imagecolortransparent($new_image, $transparent_index);
	}

	// Redimensionnement de l'image
	imagecopyresampled(
		$new_image, $image_src,
		0, 0, $src_x, $src_y,
		$new_width, $new_height, $src_w, $src_h
	);

	// Enregistrement de l'image
	$func = 'image'. $type;
	if($image_dest)
	{
		$func($new_image, $image_dest);
	}
	else
	{
		header('Content-Type: '. $type_mime);
		$func($new_image);
	}

	// Libération de la mémoire
	imagedestroy($new_image); 

	return TRUE;
}

?>

Syntaxe

bool imagethumb ( string $image_src [, string $image_dest = null [, int $max_size = 100 [, bool $expand = false [, bool $square = false ]]]] )

Arguments

  1. image_src - Chemin vers l'image source.
  2. image_dest - Le chemin de destination. S'il n'est pas défini ou s'il vaut NULL, le flux brut de l'image sera affiché directement.
    Pour éviter de fournir cet argument afin de fournir l'argument max_size, utilisez une valeur NULL.
  3. max_size - La taille maximale (largeur ou hauteur) de l'image de destination. Ce paramètre optionnel a pour valeur par défaut 100.
  4. expand - Si ce paramètre vaut TRUE, imagethumb() pourra éventuellement agrandir l'image pour atteindre la taille max_size dans le cas ou la taille de image_src est plus petite que max_size
  5. square - Si ce paramètre vaut TRUE, la miniature générée sera carrée.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès ou FALSE si une erreur survient.

Exemples

Exemple #1 Exemple avec imagethumb()

<?php

$image_src = 'image.jpg';
imagethumb($image_src); // Envoie une miniature de "image.jpg" au navigateur

?>

Exemple #2 Exemple avec imagethumb()

<?php

$image_src  = 'image.png';
$image_dest = 'thumb.png';
imagethumb($image_src, $image_dest, 90); // Créé une miniature de "image.png" de maximum 90 pixels et l'enregistre dans le fichier "thumb.png"

?>

Exemple #3 Exemple avec imagethumb()

<?php

// Exemple avec une image fraichement uploadée

if( isset($_FILES['image']) && !$_FILES['image']['error'] && $imagesize=getimagesize($_FILES['image']['tmp_name']) )
{
	$extension = str_replace(array('image/','jpeg'), array('', 'jpg'), $imagesize['mime']);
	
	$filename = time() .'.'. $extension;
	$image_path = 'images/' .$filename;
	$thumb_path = 'images/thumb_'. $filename;
	
	move_uploaded_file($_FILES['image']['tmp_name'], $image_path);
	imagethumb($image_path, $thumb_path, 120);
}

?>

Voir aussi

Commentaire(s)

  • Cette fonction ne permet pas de faire des miniatures depuis des images externes. Pour que cela fonctionne, on peut par exemple modifier le premier test :

    if( !file_exists($image_src) ) return FALSE;

    par

    if (!file_exists($image_src) && !url_exists($image_src))
    return FALSE;


    Avec url_exists qui est une fonction a créée comme celle qui suit :

    function url_exists($url) {
    $url = parse_url($url);
    if (!$url)
    return false;

    $url = array_map('trim', $url);
    $url['port'] = (!isset($url['port'])) ? 80 : (int) $url['port'];

    $path = (isset($url['path'])) ? $url['path'] : '/';
    $path .= (isset($url['query'])) ? "?$url[query]" : '';

    if (isset($url['host']) && $url['host'] != gethostbyname($url['host'])) {

    $fp = fsockopen($url['host'], $url['port'], $errno, $errstr, 30);

    if (!$fp)
    return false; //socket not opened

    fputs($fp, "HEAD $path HTTP/1.1\r\nHost: $url[host]\r\n\r\n"); //socket opened
    $headers = fread($fp, 4096);
    fclose($fp);

    if (preg_match('#^HTTP/.*\s+[(200|301|302)]+\s#i', $headers)) {//matching header
    return true;
    }
    else
    return false;
    } // if parse url
    else
    return false;
    }

    Et voilà cela fonctionne parfaitement quelque soit l'endroit où est la photo!
  • Super code bien pratique et super bien documenté.
    Franchement, c'est du beau travail,

    merci.
  • La fonction a été mise à jour et accepte maintenant un nouveau paramètre "$square".
    Ce paramètre, s'il vaut TRUE, permettra de générer une miniature que sera obligatoirement carrée.
    Dans le cas contraire, l'image gardera les proportions de l'original et aura pour le coté le plus grand la taille "$max_size" spécifiée.

Poster un commentaire