thumbnail.class.php

Répondre
xenon54
le 25/01/2005 à 03:01
xenon54
J'ai pu créé dernièrement durant mes temps libre une classe totalement PHP5 permettant la redimension d'images de types courants soit : JPG, GIF, BMP ou PNG. Les dimensions maximales avant redimension devoit être indiquée si l'on désire que redimension il y ait.
La transparence des PNG est supporté et aucun fond noir ne sera généré. La classe nécessite la compilation de la librairie libexif.

Désolé pour les anglophobes, je code toujours en anglais. :)

<?php
class thumbnail {

private $types = array(
IMAGETYPE_JPEG => 'jpeg',
IMAGETYPE_GIF => 'gif',
IMAGETYPE_BMP => 'wbmp',
IMAGETYPE_PNG => 'png'
);

private $thumbnaildir = './';

public $maxWidth = 0;
public $maxHeight = 0;


public function __construct($thumbnaildir=NULL) {

if (FALSE === extension_loaded('gd')) {
throw new Exception('gd must be compiled to use this class.');
}

if (FALSE === extension_loaded('exif')) {
throw new Exception('libexif must be compiled to use this class.');
}

$this->thumbnaildir = $thumbnaildir;

}

public function execute($filename) {

if (FALSE === file_exists($filename)) {
throw new Exception('No such file.');
}

if (FALSE === $type = exif_imagetype($filename)) {
throw new Exception('File is not an image.');
}


if (FALSE === array_key_exists($type, $this->types)) {
throw new Exception('Image type is not supported by this class.');
} else {
$type = $this->types[$type];
}

try {
$this->validation();
$result = $this->resize($filename, $type);
} catch ( Exception $e ) {
throw $e;
}

return $result;
}

private function resize($filename, $type) {

if (0 === $this->maxHeight && 0 === $this->maxWidth) {
return TRUE;
}

list($width, $height) = getimagesize($filename);

if ($width <= $this->maxWidth && $height <= $this->maxHeight) {
return TRUE;
}

if ($width > $height) {
$thumbnail_width = $this->maxWidth;
$thumbnail_height = (int) ($this->maxWidth * $height / $width);
} else {
$thumbnail_width = (int) ($this->maxHeight * $width / $height);
$thumbnail_height = $this->maxHeight;
}

$read = 'imagecreatefrom' . $type;
$write = 'image' . $type;

if (FALSE === function_exists($write) ) {
throw new Exception('Image type is not supported by your GD library.');
}

if (FALSE === $img = $read($filename) ) {
throw new Exception('An exception occured while opening original file.');
}

if ('gif' === $type) {
$des = imagecreate($thumbnail_width, $thumbnail_height);
$resize = 'imagecopyresized';
} else {
$des = imagecreatetruecolor($thumbnail_width, $thumbnail_height);
$resize = 'imagecopyresampled';
}

if ('png' === $type) {

if (FALSE === imagealphablending($des, FALSE) ) {
throw new Exception('Enable to activate full alpha information.');
}
if (FALSE === imagesavealpha($des, TRUE)) {
throw new Exception('Enable to activate full alpha information.');
}
}

if (FALSE === $resize($des, $img, 0, 0, 0, 0, $thumbnail_width, $thumbnail_height, $width, $height)) {
throw new Exception('An exception occured while resizing the original file.');
}

if (FALSE === $write($des, $this->thumbnaildir . '/' . $filename)) {
throw new Exception('An exception occured while writing thumbnail file.');
}

return TRUE;
}


private function validation() {

if (FALSE === is_writable($this->thumbnaildir)) {
throw new Exception('Thumbnails directory is not writable.');
}

if (FALSE === is_int($this->maxWidth) || FALSE === is_int($this->maxHeight)) {
throw new Exception('Maximum dimensions must be integer.');
}

if (0 > $this->maxWidth || 0 > $this->maxHeight) {
throw new Exception('Maximum dimensions must be positive integer.');
}
}


}

// Exemple d'utilisation
try {
$thumb = new thumbnail('./thumbs/');
$thumb->maxWidth = 80;
$thumb->maxHeight = 60;
$thumb->execute('image.png');
} catch (Exception $e) {

echo '';
echo 'Error message: ' , $e->getMessage() , '';
echo 'Error code: ' , $e->getCode() , '';
echo 'Script Name: ' , $e->getFile() , '';
echo 'Line Number: ' , $e->getLine() , '';
}
?>
Génération PHP.net
Lefounard
le 25/01/2005 à 10:10
Lefounard
Bien la class ! la grabde classe lol,
Dommage que free soit encore au php 4.3 !
Ciao,
I am singing in the rain , I am happy again !!
savageman
le 27/01/2005 à 12:30
savageman
Salut,

Juste une question que je me suis toujours posée, dans cette ligne:
IMAGETYPE_BMP => 'wbmp'

Le 'wbmp' signifie BMP Windows?

Cela voudrait dire que 'bmp' est le BMP OS/2...

Mais pour GD, cela ne change rien, il gere les deux type de BMP, non?

Merci!
savageman
le 27/01/2005 à 13:55
savageman
En fait, je viens de voir que le wbmp est le format bmp pour le wml sur les telephones portables...
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours