11:20:16 Programmation Web PHP Création et manipulation d'images Jérôme CUTRONA
211:20:16 Programmation Web Préambule L'utilisation habituelle de PHP consiste à produire des pages HTML. L'utilisation habituelle de PHP consiste à produire des pages HTML. Grâce à la bibliothèque GD, PHP peut produire des images enregistrées sur disque ou directement transmises au navigateur du client. Grâce à la bibliothèque GD, PHP peut produire des images enregistrées sur disque ou directement transmises au navigateur du client. Formats d'images accessibles sont GIF, JPEG et PNG Formats d'images accessibles sont GIF, JPEG et PNG Possibilités offertes par la création/manipulation d'images en PHP : Possibilités offertes par la création/manipulation d'images en PHP : redimensionnement à la volée redimensionnement à la volée CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) insertion de texte dynamique insertion de texte dynamique
311:20:16 Programmation Web Algorithme général de création Création d'une image : Création d'une image : nouvelle nouvelle à partir d'un fichier à partir d'un fichier Manipulations de l'image Manipulations de l'image dessin dessin texte texte … Production de l'image finale : Production de l'image finale : dans un fichier dans un fichier envoi vers le navigateur envoi vers le navigateur Libération mémoire Libération mémoire
411:20:16 Programmation Web Algorithme général de création <?php // Création $im = imageCreateTrueColor(100, 100) ; // Manipulations $red = imageColorAllocate($im, 255, 0, 0) ; imageFilledRectangle($im, 0, 0, 99, 99, $red) ; 99, 99, $red) ; // Envoi vers le navigateur header('Content-Type: image/png') ; imagePNG($im) ; // Libération mémoire imageDestroy($im) ;
511:20:16 Programmation Web Création d'une image (vide) resource imageCreate ( int width, int height ) construit une image vide de largeur width et de hauteur height et retourne son identifiant. L'image est à couleurs indexées. Retourne false en cas d'échec. resource imageCreateTrueColor ( int width, int height ) construit une image vide de largeur width et de hauteur height et retourne son identifiant. L'image est à couleurs "réelles" (24bits). Retourne false en cas d'échec. bool imageDestroy ( resource image ) libère la mémoire associée à image
611:20:16 Programmation Web Création d'une image (fichier) resource imageCreateFromGIF ( string nom ) construit une image à partir du fichier GIF nom resource imageCreateFromJPEG ( string nom ) construit une image à partir du fichier JPEG nom resource imageCreateFromPNG ( string nom ) construit une image à partir du fichier PNG nom resource imageCreateFromGD[2] ( string nom ) construit une image à partir du fichier GD[2] nom
711:20:16 Programmation Web Production d'une image bool imageGIF (resource image [, string fname]) construit un fichier GIF fname à partir de image bool imageJPEG (resource image [, string fname]) construit un fichier JPEG fname à partir de image bool imagePNG (resource image [, string fname]) construit un fichier PNG fname à partir de image bool imageGD[2] (resource image [, string fname]) construit un fichier GD[2] fname à partir de image Si fname est absent, le contenu est transmis Si fname est absent, le contenu est transmis
811:20:16 Programmation Web Allocation de couleurs int imageColorAllocate ( resource im, int R, int G, int B ) int R, int G, int B ) construit une couleur (R, G, B) pour l'image im et retourne son identifiant. 0 R G B 255
911:20:16 Programmation Web Allocation de couleurs int imageColorAllocateAlpha ( resource im, int R, int G, int B, int A ) int R, int G, int B, int A ) construit une couleur (R, G, B, A) pour l'image im et retourne son identifiant. 0 R G B A 127 (transparence de la couleur)
1011:20:16 Programmation Web Copie redimensionnée d'images bool imageCopyResized ( resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h ) copie une portion rectangulaire de src_im dans une portion rectangulaire dst_im. Si les portions sont de taille différente, l'approximation se fait à l'échantillon le plus proche. bool imageCopyResampled ( … ) remplace l'approximation par un ré-échantillonnage
1111:20:16 Programmation Web Dessiner dans une image int imageColorAllocate ( resource image, int red, int green, int blue ) int imageColorAllocate ( resource image, int red, int green, int blue ) bool imageArc ( resource image, int cx, int cy, int width, int height, int start, int end, int color ) bool imageArc ( resource image, int cx, int cy, int width, int height, int start, int end, int color ) bool imageLine ( resource image, int x1, int y1, int x2, int y2, int color ) bool imageLine ( resource image, int x1, int y1, int x2, int y2, int color ) bool imageString ( resource image, int font, int x, int y, string s, int color ) bool imageString ( resource image, int font, int x, int y, string s, int color )
1211:20:16 Programmation Web Création d'images à la volée <img src="img.php" alt="Mon image" alt="Mon image" height="152" width="210"> height="152" width="210"> <?php // Création $im = imageCreate(100, 100) ; // Manipulations $red = imageColorAllocate($im, 255, 0, 0) ; 255, 0, 0) ; imageFilledRectangle($im, 0, 0, 99, 99, $red) ; 99, 99, $red) ; // Envoi vers le navigateur header('Content-Type: image/png') ; imagePNG($im) ; // Libération mémoire imageDestroy($im) ; Peut dépendre de paramètres GET : img.php?t=Coucouimg.php?t=Coucou img.php?r=10&v=120&b=255img.php?r=10&v=120&b=255 img.php?i=im.jpgimg.php?i=im.jpg …
Introduction dune vision objet ? resource imageCreateTrueColor ( int width, int height ) resource imageCreateTrueColor ( int width, int height ) int imageColorAllocate ( resource image, … int imageColorAllocate ( resource image, … bool imageArc ( resource image, … bool imageArc ( resource image, … bool imageLine ( resource image, … bool imageLine ( resource image, … bool imageString ( resource image, … bool imageString ( resource image, … bool imageDestroy ( resource image ) bool imageDestroy ( resource image ) 1311:20:16 Programmation Web resource représente lentité image manipulée
Encapsulation objet class GDImage { resource $_resource image identifier private $_resource = null ; private $_resource = null ; private function __construct() { private function __construct() { } public function __destruct() { public function __destruct() { if (!is_null($this->_resource)) if (!is_null($this->_resource)) imageDestroy($this->_resource) ; imageDestroy($this->_resource) ; } 1411:20:16 Programmation Web
Encapsulation objet : usine public static function createFromSize($x, $y, $truecolor=true) { createFromSize($x, $y, $truecolor=true) { $x = (int) $x ; $y = (int) $y ; $x = (int) $x ; $y = (int) $y ; $resource = false ; $resource = false ; if ($truecolor) if ($truecolor) $resource $y) ; $resource $y) ; else $resource $y) ; else $resource $y) ; if ($resource !== false) { if ($resource !== false) { $image = new self() ; $image = new self() ; $image->_resource = $resource ; $image->_resource = $resource ; return $image ; } return $image ; } else else throw new LogicException("Failed to create GD resource") ; } throw new LogicException("Failed to create GD resource") ; } 1511:20:16 Programmation Web
Encapsulation objet : usine public static function createFromFile($filename, $filetype) { createFromFile($filename, $filetype) { if (is_file($filename)) { if (is_file($filename)) { if (in_array($filetype, self::$_factory_types)) if (in_array($filetype, self::$_factory_types)) { $functionName = 'imageCreateFrom'. $filetype ; $functionName = 'imageCreateFrom'. $filetype ; $image = new self() ; $image = new self() ; if (($tmp if (($tmp === false) { === false) { throw new Exception("unable to load file '{$filename}'") ; throw new Exception("unable to load file '{$filename}'") ; } $image->_resource = $tmp ; return $image ; $image->_resource = $tmp ; return $image ; } else throw new Exception("unknown filetype") ; } else throw new Exception("unknown filetype") ; } else throw new Exception( "{$filename} : no such file" ) ; } else throw new Exception( "{$filename} : no such file" ) ;} 1611:20:16 Programmation Web
Encapsulation objet : constantes /** /** array array */ */ private static $_factory_types = array( private static $_factory_types = array( self::GD, self::GD, self::GD2PART, self::GD2PART, self::GD2, self::GD2, self::GIF, self::GIF, self::JPEG, self::JPEG, self::PNG, self::PNG, self::WBMP, self::WBMP, self::XBM, self::XBM, self::XPM, self::XPM, ) ; ) ; 1711:20:16 Programmation Web
Encapsulation objet : usine class GDImage { const GD = 'gd' ; const GD = 'gd' ; const GD2PART = 'gd2part' ; const GD2PART = 'gd2part' ; const GD2 = 'gd2' ; const GD2 = 'gd2' ; const GIF = 'gif' ; const GIF = 'gif' ; const JPEG = 'jpeg' ; const JPEG = 'jpeg' ; const PNG = 'png' ; const PNG = 'png' ; const WBMP = 'wbmp' ; const WBMP = 'wbmp' ; const XBM = 'xbm' ; const XBM = 'xbm' ; const XPM = 'xpm' ; const XPM = 'xpm' ; 1811:20:16 Programmation Web
1911:20:16 Création d'images : vision objet <img src="img.php" alt="Mon image" alt="Mon image" height="152" width="210"> height="152" width="210"> <?php require_once('gdimage.class.php') ; // Création $im = GDImage::createFromSize(100, 100) ; = GDImage::createFromSize(100, 100) ; // Manipulations $red = $im->colorAllocate(255, 0, 0) ; $im->filledRectangle(0, 0, 99, 99, $red) ; 99, 99, $red) ; // Envoi vers le navigateur header('Content-type: image/png') ; $im->PNG() ; // Libération mémoire // Automatique, à la destruction de $im Peut dépendre de paramètres GET : img.php?t=Coucouimg.php?t=Coucou img.php?r=10&v=120&b=255img.php?r=10&v=120&b=255 img.php?i=im.jpgimg.php?i=im.jpg …
Comparaison non objet / objet 2011:20:16 Programmation Web <?php // Création $im = imageCreate(100, 100) ; // Manipulations $red = imageColorAllocate($im, 255, 0, 0) ; 255, 0, 0) ; imageFilledRectangle($im, 0, 0, 99, 99, $red) ; 99, 99, $red) ; // Envoi vers le navigateur header('Content-Type: image/png') ; imagePNG($im) ; // Libération mémoire imageDestroy($im) ; <?php require_once('gdimage.class.php') ; // Création $im = GDImage::createFromSize(100, 100) ; = GDImage::createFromSize(100, 100) ; // Manipulations $red = $im->colorAllocate(255, 0, 0) ; $im->filledRectangle(0, 0, 99, 99, $red) ; 99, 99, $red) ; // Envoi vers le navigateur header('Content-type: image/png') ; $im->PNG() ; // Libération mémoire // Automatique, à la destruction de $im