2008-04-05 16:18:13 +02:00
< ? php
2010-02-21 04:09:45 +01:00
/* Copyright ( C ) 2004 - 2010 Laurent Destailleur < eldy @ users . sourceforge . net >
2012-12-30 15:13:49 +01:00
* Copyright ( C ) 2005 - 2007 Regis Houssin < regis . houssin @ capnetworks . com >
2008-04-05 16:18:13 +02:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
2013-01-16 15:36:08 +01:00
* the Free Software Foundation ; either version 3 of the License , or
2008-04-05 16:18:13 +02:00
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2011-08-01 01:24:38 +02:00
* along with this program . If not , see < http :// www . gnu . org / licenses />.
2008-04-05 16:18:13 +02:00
* or see http :// www . gnu . org /
*/
/**
2011-10-24 10:45:06 +02:00
* \file htdocs / core / lib / images . lib . php
2011-02-07 15:23:57 +01:00
* \brief Set of function for manipulating images
2008-11-09 01:49:57 +01:00
*/
2008-04-05 16:18:13 +02:00
2011-02-07 15:23:57 +01:00
// Define size of logo small and mini
$maxwidthsmall = 270 ; $maxheightsmall = 150 ;
$maxwidthmini = 128 ; $maxheightmini = 72 ;
$quality = 80 ;
2008-04-05 16:18:13 +02:00
2010-02-21 02:45:58 +01:00
/**
2011-02-07 15:23:57 +01:00
* Return if a filename is file name of a supported image format
2012-02-04 14:39:47 +01:00
*
* @ param string $file Filename
* @ return int - 1 = Not image filename , 0 = Image filename but format not supported by PHP , 1 = Image filename with format supported
2010-02-21 02:45:58 +01:00
*/
2011-02-07 15:23:57 +01:00
function image_format_supported ( $file )
2010-02-21 02:45:58 +01:00
{
2018-02-13 16:33:45 +01:00
$regeximgext = '\.gif|\.jpg|\.jpeg|\.png|\.bmp|\.xpm|\.xbm|\.svg' ; // See also into product.class.php
2017-06-09 00:27:19 +02:00
2011-02-07 15:23:57 +01:00
// Case filename is not a format image
2016-12-31 16:16:20 +01:00
if ( ! preg_match ( '/(' . $regeximgext . ')$/i' , $file , $reg )) return - 1 ;
2011-02-07 15:23:57 +01:00
// Case filename is a format image but not supported by this PHP
$imgfonction = '' ;
if ( strtolower ( $reg [ 1 ]) == '.gif' ) $imgfonction = 'imagecreatefromgif' ;
if ( strtolower ( $reg [ 1 ]) == '.png' ) $imgfonction = 'imagecreatefrompng' ;
if ( strtolower ( $reg [ 1 ]) == '.jpg' ) $imgfonction = 'imagecreatefromjpeg' ;
if ( strtolower ( $reg [ 1 ]) == '.jpeg' ) $imgfonction = 'imagecreatefromjpeg' ;
if ( strtolower ( $reg [ 1 ]) == '.bmp' ) $imgfonction = 'imagecreatefromwbmp' ;
2016-12-31 16:16:20 +01:00
if ( strtolower ( $reg [ 1 ]) == '.xpm' ) $imgfonction = 'imagecreatefromxpm' ;
if ( strtolower ( $reg [ 1 ]) == '.xbm' ) $imgfonction = 'imagecreatefromxbm' ;
2011-02-07 15:23:57 +01:00
if ( $imgfonction )
{
if ( ! function_exists ( $imgfonction ))
{
// Fonctions de conversion non presente dans ce PHP
return 0 ;
}
}
// Filename is a format image and supported by this PHP
return 1 ;
}
2010-02-21 02:45:58 +01:00
2011-02-07 15:23:57 +01:00
/**
* Return size of image file on disk ( Supported extensions are gif , jpg , png and bmp )
2012-02-04 14:39:47 +01:00
*
* @ param string $file Full path name of file
2013-07-03 16:06:42 +02:00
* @ param bool $url Image with url ( true or false )
2012-02-04 14:39:47 +01:00
* @ return array array ( 'width' => width , 'height' => height )
2011-02-07 15:23:57 +01:00
*/
2013-07-03 16:06:42 +02:00
function dol_getImageSize ( $file , $url = false )
2011-02-07 15:23:57 +01:00
{
2010-02-21 02:45:58 +01:00
$ret = array ();
if ( image_format_supported ( $file ) < 0 ) return $ret ;
2017-01-12 16:03:07 +01:00
$filetoread = $file ;
2013-07-03 16:06:42 +02:00
if ( ! $url )
{
2017-01-12 16:03:07 +01:00
$filetoread = realpath ( dol_osencode ( $file )); // Chemin canonique absolu de l'image
2013-07-03 16:06:42 +02:00
}
2010-02-21 02:45:58 +01:00
2017-01-12 16:03:07 +01:00
if ( $filetoread )
{
$infoImg = getimagesize ( $filetoread ); // Recuperation des infos de l'image
$ret [ 'width' ] = $infoImg [ 0 ]; // Largeur de l'image
$ret [ 'height' ] = $infoImg [ 1 ]; // Hauteur de l'image
}
2017-06-09 00:27:19 +02:00
2010-02-21 02:45:58 +01:00
return $ret ;
}
2008-04-05 16:18:13 +02:00
2010-02-21 04:09:45 +01:00
/**
2011-02-07 15:23:57 +01:00
* Resize or crop an image file ( Supported extensions are gif , jpg , png and bmp )
2012-02-04 14:39:47 +01:00
*
* @ param string $file Path of file to resize / crop
* @ param int $mode 0 = Resize , 1 = Crop
* @ param int $newWidth Largeur maximum que dois faire l ' image destination ( 0 = keep ratio )
* @ param int $newHeight Hauteur maximum que dois faire l ' image destination ( 0 = keep ratio )
* @ param int $src_x Position of croping image in source image ( not use if mode = 0 )
* @ param int $src_y Position of croping image in source image ( not use if mode = 0 )
* @ return int File name if OK , error message if KO
2010-02-21 04:09:45 +01:00
*/
2010-02-21 12:50:21 +01:00
function dol_imageResizeOrCrop ( $file , $mode , $newWidth , $newHeight , $src_x = 0 , $src_y = 0 )
2010-02-21 04:09:45 +01:00
{
2012-08-22 23:11:24 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/functions2.lib.php' ;
2010-02-21 04:09:45 +01:00
global $conf , $langs ;
2010-02-21 12:50:21 +01:00
dol_syslog ( " dol_imageResizeOrCrop file= " . $file . " mode= " . $mode . " newWidth= " . $newWidth . " newHeight= " . $newHeight . " src_x= " . $src_x . " src_y= " . $src_y );
2010-02-21 04:09:45 +01:00
// Clean parameters
$file = trim ( $file );
// Check parameters
if ( ! $file )
{
// Si le fichier n'a pas ete indique
return 'Bad parameter file' ;
}
elseif ( ! file_exists ( $file ))
{
// Si le fichier passe en parametre n'existe pas
return $langs -> trans ( " ErrorFileNotFound " , $file );
}
elseif ( image_format_supported ( $file ) < 0 )
{
2010-02-21 12:50:21 +01:00
return 'This filename ' . $file . ' does not seem to be an image filename.' ;
2010-02-21 04:09:45 +01:00
}
2010-02-21 12:50:21 +01:00
elseif ( ! is_numeric ( $newWidth ) && ! is_numeric ( $newHeight ))
{
2010-02-21 04:09:45 +01:00
return 'Wrong value for parameter newWidth or newHeight' ;
}
2010-02-21 12:50:21 +01:00
elseif ( $mode == 0 && $newWidth <= 0 && $newHeight <= 0 )
{
return 'At least newHeight or newWidth must be defined for resizing' ;
}
elseif ( $mode == 1 && ( $newWidth <= 0 || $newHeight <= 0 ))
2010-02-21 04:09:45 +01:00
{
2010-02-21 12:50:21 +01:00
return 'Both newHeight or newWidth must be defined for croping' ;
2010-02-21 04:09:45 +01:00
}
2017-01-12 16:03:07 +01:00
$filetoread = realpath ( dol_osencode ( $file )); // Chemin canonique absolu de l'image
2010-02-21 04:09:45 +01:00
2017-01-12 16:03:07 +01:00
$infoImg = getimagesize ( $filetoread ); // Recuperation des infos de l'image
2010-02-21 04:09:45 +01:00
$imgWidth = $infoImg [ 0 ]; // Largeur de l'image
$imgHeight = $infoImg [ 1 ]; // Hauteur de l'image
2010-02-21 12:50:21 +01:00
if ( $mode == 0 ) // If resize, we check parameters
2010-02-21 04:09:45 +01:00
{
2010-02-21 12:50:21 +01:00
if ( $newWidth <= 0 )
{
$newWidth = intval (( $newHeight / $imgHeight ) * $imgWidth ); // Keep ratio
}
if ( $newHeight <= 0 )
{
$newHeight = intval (( $newWidth / $imgWidth ) * $imgHeight ); // Keep ratio
}
2010-02-21 04:09:45 +01:00
}
$imgfonction = '' ;
switch ( $infoImg [ 2 ])
{
case 1 : // IMG_GIF
$imgfonction = 'imagecreatefromgif' ;
break ;
case 2 : // IMG_JPG
$imgfonction = 'imagecreatefromjpeg' ;
break ;
case 3 : // IMG_PNG
$imgfonction = 'imagecreatefrompng' ;
break ;
case 4 : // IMG_WBMP
$imgfonction = 'imagecreatefromwbmp' ;
break ;
}
if ( $imgfonction )
{
if ( ! function_exists ( $imgfonction ))
{
// Fonctions de conversion non presente dans ce PHP
return 'Resize not possible. This PHP does not support GD functions ' . $imgfonction ;
}
}
// Initialisation des variables selon l'extension de l'image
switch ( $infoImg [ 2 ])
{
case 1 : // Gif
2017-01-12 16:03:07 +01:00
$img = imagecreatefromgif ( $filetoread );
2010-02-21 12:50:21 +01:00
$extImg = '.gif' ; // File name extension of image
$newquality = 'NU' ; // Quality is not used for this format
2010-02-21 04:09:45 +01:00
break ;
case 2 : // Jpg
2017-01-12 16:03:07 +01:00
$img = imagecreatefromjpeg ( $filetoread );
2010-02-21 12:50:21 +01:00
$extImg = '.jpg' ;
$newquality = 100 ; // % quality maximum
2010-02-21 04:09:45 +01:00
break ;
case 3 : // Png
2017-01-12 16:03:07 +01:00
$img = imagecreatefrompng ( $filetoread );
2010-02-21 04:09:45 +01:00
$extImg = '.png' ;
2010-02-21 12:50:21 +01:00
$newquality = 0 ; // No compression (0-9)
2010-02-21 04:09:45 +01:00
break ;
case 4 : // Bmp
2017-01-12 16:03:07 +01:00
$img = imagecreatefromwbmp ( $filetoread );
2010-02-21 04:09:45 +01:00
$extImg = '.bmp' ;
2010-02-21 12:50:21 +01:00
$newquality = 'NU' ; // Quality is not used for this format
2010-02-21 04:09:45 +01:00
break ;
}
// Create empty image
if ( $infoImg [ 2 ] == 1 )
{
// Compatibilite image GIF
$imgThumb = imagecreate ( $newWidth , $newHeight );
}
else
{
$imgThumb = imagecreatetruecolor ( $newWidth , $newHeight );
}
// Activate antialiasing for better quality
if ( function_exists ( 'imageantialias' ))
{
imageantialias ( $imgThumb , true );
}
// This is to keep transparent alpha channel if exists (PHP >= 4.2)
if ( function_exists ( 'imagesavealpha' ))
{
imagesavealpha ( $imgThumb , true );
}
// Initialisation des variables selon l'extension de l'image
switch ( $infoImg [ 2 ])
{
case 1 : // Gif
$trans_colour = imagecolorallocate ( $imgThumb , 255 , 255 , 255 ); // On procede autrement pour le format GIF
imagecolortransparent ( $imgThumb , $trans_colour );
break ;
case 2 : // Jpg
$trans_colour = imagecolorallocatealpha ( $imgThumb , 255 , 255 , 255 , 0 );
break ;
case 3 : // Png
imagealphablending ( $imgThumb , false ); // Pour compatibilite sur certain systeme
$trans_colour = imagecolorallocatealpha ( $imgThumb , 255 , 255 , 255 , 127 ); // Keep transparent channel
break ;
case 4 : // Bmp
$trans_colour = imagecolorallocatealpha ( $imgThumb , 255 , 255 , 255 , 0 );
break ;
}
if ( function_exists ( " imagefill " )) imagefill ( $imgThumb , 0 , 0 , $trans_colour );
2010-02-21 12:50:21 +01:00
dol_syslog ( " dol_imageResizeOrCrop: convert image from ( $imgWidth x $imgHeight ) at position ( $src_x x $src_y ) to ( $newWidth x $newHeight ) as $extImg , newquality= $newquality " );
2010-02-21 04:09:45 +01:00
//imagecopyresized($imgThumb, $img, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $imgWidth, $imgHeight); // Insere l'image de base redimensionnee
2010-02-21 12:50:21 +01:00
imagecopyresampled ( $imgThumb , $img , 0 , 0 , $src_x , $src_y , $newWidth , $newHeight , ( $mode == 0 ? $imgWidth : $newWidth ), ( $mode == 0 ? $imgHeight : $newHeight )); // Insere l'image de base redimensionnee
2010-02-21 04:09:45 +01:00
$imgThumbName = $file ;
// Check if permission are ok
//$fp = fopen($imgThumbName, "w");
//fclose($fp);
// Create image on disk
switch ( $infoImg [ 2 ])
{
case 1 : // Gif
imagegif ( $imgThumb , $imgThumbName );
break ;
case 2 : // Jpg
imagejpeg ( $imgThumb , $imgThumbName , $newquality );
break ;
case 3 : // Png
imagepng ( $imgThumb , $imgThumbName , $newquality );
break ;
case 4 : // Bmp
2013-09-05 17:56:28 +02:00
image2wbmp ( $imgThumb , $imgThumbName );
2010-02-21 04:09:45 +01:00
break ;
}
// Set permissions on file
if ( ! empty ( $conf -> global -> MAIN_UMASK )) @ chmod ( $imgThumbName , octdec ( $conf -> global -> MAIN_UMASK ));
2011-07-06 00:51:24 +02:00
// Free memory. This does not delete image.
imagedestroy ( $img );
2010-02-21 04:09:45 +01:00
imagedestroy ( $imgThumb );
2010-06-02 10:34:44 +02:00
clearstatcache (); // File was replaced by a modified one, so we clear file caches.
2010-02-21 12:50:21 +01:00
2010-02-21 04:09:45 +01:00
return $imgThumbName ;
}
2016-04-09 19:42:34 +02:00
/**
* dolRotateImage if image is a jpg file .
* Currently use an autodetection to know if we can rotate .
* TODO Introduce a new parameter to force rotate .
*
* @ param string $file_path Full path to image to rotate
* @ return boolean Success or not
*/
function dolRotateImage ( $file_path )
{
$exif = @ exif_read_data ( $file_path );
if ( $exif === false ) {
return false ;
}
$orientation = intval ( @ $exif [ 'Orientation' ]);
if ( ! in_array ( $orientation , array ( 3 , 6 , 8 ))) {
return false ;
}
$image = @ imagecreatefromjpeg ( $file_path );
switch ( $orientation ) {
case 3 :
$image = @ imagerotate ( $image , 180 , 0 );
break ;
case 6 :
$image = @ imagerotate ( $image , 270 , 0 );
break ;
case 8 :
$image = @ imagerotate ( $image , 90 , 0 );
break ;
default :
return false ;
}
$success = imagejpeg ( $image , $file_path );
// Free up memory (imagedestroy does not delete files):
@ imagedestroy ( $image );
return $success ;
}
2008-04-08 01:46:01 +02:00
/**
2011-02-07 15:23:57 +01:00
* Create a thumbnail from an image file ( Supported extensions are gif , jpg , png and bmp ) .
* If file is myfile . jpg , new file may be myfile_small . jpg
2011-12-14 17:13:09 +01:00
*
* @ param string $file Path of source file to resize
* @ param int $maxWidth Largeur maximum que dois faire la miniature ( - 1 = unchanged , 160 by default )
* @ param int $maxHeight Hauteur maximum que dois faire l ' image ( - 1 = unchanged , 120 by default )
* @ param string $extName Extension to differenciate thumb file name ( '_small' , '_mini' )
* @ param int $quality Quality of compression ( 0 = worst , 100 = best )
* @ param string $outdir Directory where to store thumb
2016-04-02 14:46:04 +02:00
* @ param int $targetformat New format of target ( IMAGETYPE_GIF , IMAGETYPE_JPG , IMAGETYPE_PNG , IMAGETYPE_BMP , IMAGETYPE_WBMP ... or 0 to keep old format )
2017-08-01 15:53:22 +02:00
* @ return string Full path of thumb or '' if it fails or 'Error...' if it fails
2008-04-05 16:18:13 +02:00
*/
2010-08-20 21:19:24 +02:00
function vignette ( $file , $maxWidth = 160 , $maxHeight = 120 , $extName = '_small' , $quality = 50 , $outdir = 'thumbs' , $targetformat = 0 )
2008-04-05 16:18:13 +02:00
{
2012-08-22 23:11:24 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/functions2.lib.php' ;
2008-11-16 02:09:04 +01:00
2008-11-09 01:49:57 +01:00
global $conf , $langs ;
2008-04-05 16:18:13 +02:00
2011-06-22 11:11:00 +02:00
dol_syslog ( " vignette file= " . $file . " extName= " . $extName . " maxWidth= " . $maxWidth . " maxHeight= " . $maxHeight . " quality= " . $quality . " outdir= " . $outdir . " targetformat= " . $targetformat );
2008-11-28 10:46:47 +01:00
2008-11-09 01:49:57 +01:00
// Clean parameters
2008-04-05 16:18:13 +02:00
$file = trim ( $file );
2008-11-09 01:49:57 +01:00
// Check parameters
2008-04-05 16:18:13 +02:00
if ( ! $file )
{
2008-11-09 01:49:57 +01:00
// Si le fichier n'a pas ete indique
2011-06-22 11:11:00 +02:00
return 'ErrorBadParameters' ;
2008-04-05 16:18:13 +02:00
}
elseif ( ! file_exists ( $file ))
{
2008-11-09 01:49:57 +01:00
// Si le fichier passe en parametre n'existe pas
2011-06-22 11:11:00 +02:00
dol_syslog ( $langs -> trans ( " ErrorFileNotFound " , $file ), LOG_ERR );
return $langs -> trans ( " ErrorFileNotFound " , $file );
2008-04-05 16:18:13 +02:00
}
elseif ( image_format_supported ( $file ) < 0 )
{
2011-06-22 11:11:00 +02:00
dol_syslog ( 'This file ' . $file . ' does not seem to be an image format file name.' , LOG_WARNING );
return 'ErrorBadImageFormat' ;
2008-04-05 16:18:13 +02:00
}
2010-02-13 23:20:32 +01:00
elseif ( ! is_numeric ( $maxWidth ) || empty ( $maxWidth ) || $maxWidth < - 1 ){
2008-11-09 01:49:57 +01:00
// Si la largeur max est incorrecte (n'est pas numerique, est vide, ou est inferieure a 0)
2011-06-22 11:11:00 +02:00
dol_syslog ( 'Wrong value for parameter maxWidth' , LOG_ERR );
2011-07-06 00:40:35 +02:00
return 'Error: Wrong value for parameter maxWidth' ;
2008-04-05 16:18:13 +02:00
}
2010-02-13 23:20:32 +01:00
elseif ( ! is_numeric ( $maxHeight ) || empty ( $maxHeight ) || $maxHeight < - 1 ){
2008-11-09 01:49:57 +01:00
// Si la hauteur max est incorrecte (n'est pas numerique, est vide, ou est inferieure a 0)
2011-06-22 11:11:00 +02:00
dol_syslog ( 'Wrong value for parameter maxHeight' , LOG_ERR );
2011-07-06 00:40:35 +02:00
return 'Error: Wrong value for parameter maxHeight' ;
2008-04-05 16:18:13 +02:00
}
2017-01-12 16:03:07 +01:00
$filetoread = realpath ( dol_osencode ( $file )); // Chemin canonique absolu de l'image
2008-04-05 16:18:13 +02:00
2017-01-12 16:03:07 +01:00
$infoImg = getimagesize ( $filetoread ); // Recuperation des infos de l'image
2008-04-05 16:18:13 +02:00
$imgWidth = $infoImg [ 0 ]; // Largeur de l'image
$imgHeight = $infoImg [ 1 ]; // Hauteur de l'image
2010-02-13 23:20:32 +01:00
if ( $maxWidth == - 1 ) $maxWidth = $infoImg [ 0 ]; // If size is -1, we keep unchanged
if ( $maxHeight == - 1 ) $maxHeight = $infoImg [ 1 ]; // If size is -1, we keep unchanged
2008-11-09 01:49:57 +01:00
// Si l'image est plus petite que la largeur et la hauteur max, on ne cree pas de vignette
2008-04-05 16:18:13 +02:00
if ( $infoImg [ 0 ] < $maxWidth && $infoImg [ 1 ] < $maxHeight )
{
// On cree toujours les vignettes
2009-02-20 23:53:15 +01:00
dol_syslog ( " File size is smaller than thumb size " , LOG_DEBUG );
2008-11-09 01:49:57 +01:00
//return 'Le fichier '.$file.' ne necessite pas de creation de vignette';
2008-04-05 16:18:13 +02:00
}
$imgfonction = '' ;
switch ( $infoImg [ 2 ])
{
2011-12-14 17:13:09 +01:00
case IMAGETYPE_GIF : // 1
2008-04-05 16:18:13 +02:00
$imgfonction = 'imagecreatefromgif' ;
break ;
2011-12-14 17:13:09 +01:00
case IMAGETYPE_JPEG : // 2
2008-04-05 16:18:13 +02:00
$imgfonction = 'imagecreatefromjpeg' ;
break ;
2011-12-14 17:13:09 +01:00
case IMAGETYPE_PNG : // 3
2008-04-05 16:18:13 +02:00
$imgfonction = 'imagecreatefrompng' ;
break ;
2011-12-14 17:13:09 +01:00
case IMAGETYPE_BMP : // 6
// Not supported by PHP GD
break ;
case IMAGETYPE_WBMP : // 15
2008-04-05 16:18:13 +02:00
$imgfonction = 'imagecreatefromwbmp' ;
break ;
}
if ( $imgfonction )
{
if ( ! function_exists ( $imgfonction ))
{
// Fonctions de conversion non presente dans ce PHP
2011-07-06 00:40:35 +02:00
return 'Error: Creation of thumbs not possible. This PHP does not support GD function ' . $imgfonction ;
2008-04-05 16:18:13 +02:00
}
}
2008-11-09 01:49:57 +01:00
// On cree le repertoire contenant les vignettes
2017-01-12 16:03:07 +01:00
$dirthumb = dirname ( $file ) . ( $outdir ? '/' . $outdir : '' ); // Chemin du dossier contenant les vignettes
2012-02-19 18:34:22 +01:00
dol_mkdir ( $dirthumb );
2008-04-05 16:18:13 +02:00
// Initialisation des variables selon l'extension de l'image
2017-06-09 00:27:19 +02:00
$img = null ;
2008-04-05 16:18:13 +02:00
switch ( $infoImg [ 2 ])
{
2011-12-14 17:13:09 +01:00
case IMAGETYPE_GIF : // 1
2017-01-12 16:03:07 +01:00
$img = imagecreatefromgif ( $filetoread );
2008-04-05 16:18:13 +02:00
$extImg = '.gif' ; // Extension de l'image
break ;
2011-12-14 17:13:09 +01:00
case IMAGETYPE_JPEG : // 2
2017-01-12 16:03:07 +01:00
$img = imagecreatefromjpeg ( $filetoread );
2012-03-18 01:21:18 +01:00
$extImg = ( preg_match ( '/\.jpeg$/' , $file ) ? '.jpeg' : '.jpg' ); // Extension de l'image
2008-04-05 16:18:13 +02:00
break ;
2011-12-14 17:13:09 +01:00
case IMAGETYPE_PNG : // 3
2017-01-12 16:03:07 +01:00
$img = imagecreatefrompng ( $filetoread );
2008-04-05 16:18:13 +02:00
$extImg = '.png' ;
break ;
2011-12-14 17:13:09 +01:00
case IMAGETYPE_BMP : // 6
// Not supported by PHP GD
$extImg = '.bmp' ;
break ;
case IMAGETYPE_WBMP : // 15
2017-01-12 16:03:07 +01:00
$img = imagecreatefromwbmp ( $filetoread );
2008-04-05 16:18:13 +02:00
$extImg = '.bmp' ;
break ;
}
2011-12-14 17:13:09 +01:00
if ( ! is_resource ( $img ))
{
dol_syslog ( 'Failed to detect type of image. We found infoImg[2]=' . $infoImg [ 2 ], LOG_WARNING );
return 0 ;
}
2008-04-05 16:18:13 +02:00
2008-11-09 01:49:57 +01:00
// Initialisation des dimensions de la vignette si elles sont superieures a l'original
2008-04-05 16:18:13 +02:00
if ( $maxWidth > $imgWidth ){ $maxWidth = $imgWidth ; }
if ( $maxHeight > $imgHeight ){ $maxHeight = $imgHeight ; }
$whFact = $maxWidth / $maxHeight ; // Facteur largeur/hauteur des dimensions max de la vignette
$imgWhFact = $imgWidth / $imgHeight ; // Facteur largeur/hauteur de l'original
// Fixe les dimensions de la vignette
2012-03-18 01:21:18 +01:00
if ( $whFact < $imgWhFact )
{
2008-11-09 01:49:57 +01:00
// Si largeur determinante
2008-04-05 16:18:13 +02:00
$thumbWidth = $maxWidth ;
$thumbHeight = $thumbWidth / $imgWhFact ;
2012-03-18 01:21:18 +01:00
}
else
{
2008-11-09 01:49:57 +01:00
// Si hauteur determinante
2008-04-05 16:18:13 +02:00
$thumbHeight = $maxHeight ;
$thumbWidth = $thumbHeight * $imgWhFact ;
}
$thumbHeight = round ( $thumbHeight );
$thumbWidth = round ( $thumbWidth );
2008-11-28 10:46:47 +01:00
2010-08-20 21:19:24 +02:00
// Define target format
if ( empty ( $targetformat )) $targetformat = $infoImg [ 2 ];
2008-04-05 16:18:13 +02:00
// Create empty image
2011-12-14 17:13:09 +01:00
if ( $targetformat == IMAGETYPE_GIF )
2008-04-05 16:18:13 +02:00
{
2008-11-09 01:49:57 +01:00
// Compatibilite image GIF
2008-04-05 16:18:13 +02:00
$imgThumb = imagecreate ( $thumbWidth , $thumbHeight );
}
else
{
$imgThumb = imagecreatetruecolor ( $thumbWidth , $thumbHeight );
}
// Activate antialiasing for better quality
if ( function_exists ( 'imageantialias' ))
{
imageantialias ( $imgThumb , true );
}
// This is to keep transparent alpha channel if exists (PHP >= 4.2)
if ( function_exists ( 'imagesavealpha' ))
{
imagesavealpha ( $imgThumb , true );
}
2008-11-28 10:46:47 +01:00
2008-04-05 16:18:13 +02:00
// Initialisation des variables selon l'extension de l'image
2016-04-02 15:00:58 +02:00
// $targetformat is 0 by default, in such case, we keep original extension
2010-08-20 21:19:24 +02:00
switch ( $targetformat )
2008-04-05 16:18:13 +02:00
{
2011-12-14 17:13:09 +01:00
case IMAGETYPE_GIF : // 1
2008-11-09 01:49:57 +01:00
$trans_colour = imagecolorallocate ( $imgThumb , 255 , 255 , 255 ); // On procede autrement pour le format GIF
2008-04-05 16:18:13 +02:00
imagecolortransparent ( $imgThumb , $trans_colour );
2010-08-20 21:19:24 +02:00
$extImgTarget = '.gif' ;
$newquality = 'NU' ;
break ;
2011-12-14 17:13:09 +01:00
case IMAGETYPE_JPEG : // 2
$trans_colour = imagecolorallocatealpha ( $imgThumb , 255 , 255 , 255 , 0 );
2015-10-25 19:31:13 +01:00
$extImgTarget = ( preg_match ( '/\.jpeg$/i' , $file ) ? '.jpeg' : '.jpg' );
2010-08-20 21:19:24 +02:00
$newquality = $quality ;
break ;
2011-12-14 17:13:09 +01:00
case IMAGETYPE_PNG : // 3
2008-11-09 01:49:57 +01:00
imagealphablending ( $imgThumb , false ); // Pour compatibilite sur certain systeme
2008-04-05 16:18:13 +02:00
$trans_colour = imagecolorallocatealpha ( $imgThumb , 255 , 255 , 255 , 127 ); // Keep transparent channel
2010-08-20 21:19:24 +02:00
$extImgTarget = '.png' ;
$newquality = $quality - 100 ;
$newquality = round ( abs ( $quality - 100 ) * 9 / 100 );
break ;
2011-12-14 17:13:09 +01:00
case IMAGETYPE_BMP : // 6
// Not supported by PHP GD
$extImgTarget = '.bmp' ;
$newquality = 'NU' ;
break ;
case IMAGETYPE_WBMP : // 15
2008-04-05 16:18:13 +02:00
$trans_colour = imagecolorallocatealpha ( $imgThumb , 255 , 255 , 255 , 0 );
2010-08-20 21:19:24 +02:00
$extImgTarget = '.bmp' ;
$newquality = 'NU' ;
break ;
2008-04-05 16:18:13 +02:00
}
if ( function_exists ( " imagefill " )) imagefill ( $imgThumb , 0 , 0 , $trans_colour );
2009-02-20 23:53:15 +01:00
dol_syslog ( " vignette: convert image from ( $imgWidth x $imgHeight ) to ( $thumbWidth x $thumbHeight ) as $extImg , newquality= $newquality " );
2008-11-09 01:49:57 +01:00
//imagecopyresized($imgThumb, $img, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $imgWidth, $imgHeight); // Insere l'image de base redimensionnee
imagecopyresampled ( $imgThumb , $img , 0 , 0 , 0 , 0 , $thumbWidth , $thumbHeight , $imgWidth , $imgHeight ); // Insere l'image de base redimensionnee
2008-04-05 16:18:13 +02:00
2009-10-21 19:42:31 +02:00
$fileName = preg_replace ( '/(\.gif|\.jpeg|\.jpg|\.png|\.bmp)$/i' , '' , $file ); // On enleve extension quelquesoit la casse
2008-04-05 16:18:13 +02:00
$fileName = basename ( $fileName );
2015-11-06 01:56:56 +01:00
//$imgThumbName = $dirthumb.'/'.getImageFileNameForSize(basename($file), $extName, $extImgTarget); // Full path of thumb file
$imgThumbName = getImageFileNameForSize ( $file , $extName , $extImgTarget ); // Full path of thumb file
2008-04-05 16:18:13 +02:00
// Check if permission are ok
//$fp = fopen($imgThumbName, "w");
//fclose($fp);
// Create image on disk
2010-08-20 21:19:24 +02:00
switch ( $targetformat )
2008-04-05 16:18:13 +02:00
{
2011-12-14 17:13:09 +01:00
case IMAGETYPE_GIF : // 1
2008-04-05 16:18:13 +02:00
imagegif ( $imgThumb , $imgThumbName );
break ;
2011-12-14 17:13:09 +01:00
case IMAGETYPE_JPEG : // 2
2008-04-05 16:18:13 +02:00
imagejpeg ( $imgThumb , $imgThumbName , $newquality );
break ;
2011-12-14 17:13:09 +01:00
case IMAGETYPE_PNG : // 3
2008-04-05 16:18:13 +02:00
imagepng ( $imgThumb , $imgThumbName , $newquality );
break ;
2011-12-14 17:13:09 +01:00
case IMAGETYPE_BMP : // 6
// Not supported by PHP GD
break ;
case IMAGETYPE_WBMP : // 15
2013-09-05 17:56:28 +02:00
image2wbmp ( $imgThumb , $imgThumbName );
2008-04-05 16:18:13 +02:00
break ;
}
2008-11-09 01:49:57 +01:00
// Set permissions on file
if ( ! empty ( $conf -> global -> MAIN_UMASK )) @ chmod ( $imgThumbName , octdec ( $conf -> global -> MAIN_UMASK ));
2011-07-06 00:51:24 +02:00
// Free memory. This does not delete image.
imagedestroy ( $img );
imagedestroy ( $imgThumb );
2008-04-05 16:18:13 +02:00
return $imgThumbName ;
}