Fix conversion of images

This commit is contained in:
Laurent Destailleur 2021-05-02 15:15:27 +02:00
parent 92c1022b8e
commit 39f7d0bed8

View File

@ -182,10 +182,13 @@ function dol_imageResizeOrCrop($file, $mode, $newWidth, $newHeight, $src_x = 0,
$filetoread = realpath(dol_osencode($file)); // Chemin canonique absolu de l'image
$infoImg = getimagesize($filetoread); // Recuperation des infos de l'image
$infoImg = getimagesize($filetoread); // Get data about src image
$imgWidth = $infoImg[0]; // Largeur de l'image
$imgHeight = $infoImg[1]; // Hauteur de l'image
$imgTargetName = ($filetowrite ? $filetowrite : $file);
$infoImgTarget = getimagesize($imgTargetName); // Get data about target image
if ($mode == 0) { // If resize, we check parameters
if (!empty($filetowrite) && $filetowrite != $file && $newWidth <= 0 && $newHeight <= 0) {
$newWidth = $imgWidth;
@ -214,93 +217,86 @@ function dol_imageResizeOrCrop($file, $mode, $newWidth, $newHeight, $src_x = 0,
case 4: // IMG_WBMP
$imgfonction = 'imagecreatefromwbmp';
break;
case 17: // IMG_WBMP
case 17: // IMG_WBMP
$imgfonction = 'imagecreatefromwebp';
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;
return 'Read of image not possible. This PHP does not support GD functions '.$imgfonction;
}
}
// Initialisation des variables selon l'extension de l'image
// Read source image file
switch ($infoImg[2]) {
case 1: // Gif
$img = imagecreatefromgif($filetoread);
$extImg = '.gif'; // File name extension of image
$newquality = 'NU'; // Quality is not used for this format
break;
case 2: // Jpg
$img = imagecreatefromjpeg($filetoread);
$extImg = '.jpg';
$newquality = ($newquality ? $newquality : '100'); // % quality maximum
break;
case 3: // Png
$img = imagecreatefrompng($filetoread);
$extImg = '.png';
$newquality = 0; // No compression (0-9)
break;
case 4: // Bmp
$img = imagecreatefromwbmp($filetoread);
$extImg = '.bmp';
$newquality = 'NU'; // Quality is not used for this format
break;
case 18: // Webp
$img = imagecreatefromwebp($filetoread);
$extImg = '.webp';
$newquality = ($newquality ? $newquality : '100'); // % quality maximum
break;
}
// Create empty image
// Create empty image for target
if ($infoImg[2] == 1) {
// Compatibilite image GIF
$imgThumb = imagecreate($newWidth, $newHeight);
// Compatibility image GIF
$imgTarget = imagecreate($newWidth, $newHeight);
} else {
$imgThumb = imagecreatetruecolor($newWidth, $newHeight);
$imgTarget = imagecreatetruecolor($newWidth, $newHeight);
}
// Activate antialiasing for better quality
if (function_exists('imageantialias')) {
imageantialias($imgThumb, true);
imageantialias($imgTarget, true);
}
// This is to keep transparent alpha channel if exists (PHP >= 4.2)
if (function_exists('imagesavealpha')) {
imagesavealpha($imgThumb, true);
imagesavealpha($imgTarget, 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);
$trans_colour = imagecolorallocate($imgTarget, 255, 255, 255); // On procede autrement pour le format GIF
imagecolortransparent($imgTarget, $trans_colour);
break;
case 2: // Jpg
$trans_colour = imagecolorallocatealpha($imgThumb, 255, 255, 255, 0);
$trans_colour = imagecolorallocatealpha($imgTarget, 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
imagealphablending($imgTarget, false); // Pour compatibilite sur certain systeme
$trans_colour = imagecolorallocatealpha($imgTarget, 255, 255, 255, 127); // Keep transparent channel
break;
case 4: // Bmp
$trans_colour = imagecolorallocatealpha($imgThumb, 255, 255, 255, 0);
$trans_colour = imagecolorallocatealpha($imgTarget, 255, 255, 255, 0);
break;
case 18: // Webp
$trans_colour = imagecolorallocatealpha($imgThumb, 255, 255, 255, 127);
$trans_colour = imagecolorallocatealpha($imgTarget, 255, 255, 255, 127);
break;
}
if (function_exists("imagefill")) {
imagefill($imgThumb, 0, 0, $trans_colour);
imagefill($imgTarget, 0, 0, $trans_colour);
}
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");
//imagecopyresized($imgThumb, $img, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $imgWidth, $imgHeight); // Insere l'image de base redimensionnee
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
$imgTargetName = ($filetowrite ? $filetowrite : $file);
dol_syslog("dol_imageResizeOrCrop: convert image from ($imgWidth x $imgHeight) at position ($src_x x $src_y) to ($newWidth x $newHeight) as $extImg");
//imagecopyresized($imgTarget, $img, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $imgWidth, $imgHeight); // Insere l'image de base redimensionnee
imagecopyresampled($imgTarget, $img, 0, 0, $src_x, $src_y, $newWidth, $newHeight, ($mode == 0 ? $imgWidth : $newWidth), ($mode == 0 ? $imgHeight : $newHeight)); // Insere l'image de base redimensionnee
// Check if permission are ok
//$fp = fopen($imgTargetName, "w");
@ -311,19 +307,24 @@ function dol_imageResizeOrCrop($file, $mode, $newWidth, $newHeight, $src_x = 0,
// Create image on disk (overwrite file if exists)
switch ($newExt) {
case 'gif': // Gif
imagegif($imgThumb, $imgTargetName);
$newquality = 'NU'; // Quality is not used for this format
imagegif($imgTarget, $imgTargetName);
break;
case 'jpg': // Jpg
imagejpeg($imgThumb, $imgTargetName, $newquality);
$newquality = ($newquality ? $newquality : '100'); // % quality maximum
imagejpeg($imgTarget, $imgTargetName, $newquality);
break;
case 'png': // Png
imagepng($imgThumb, $imgTargetName, $newquality);
$newquality = 0; // No compression (0-9)
imagepng($imgTarget, $imgTargetName, $newquality);
break;
case 'bmp': // Bmp
imagewbmp($imgThumb, $imgTargetName);
$newquality = 'NU'; // Quality is not used for this format
imagewbmp($imgTarget, $imgTargetName);
break;
case 'webp': // Webp
imagewebp($imgThumb, $imgTargetName, $newquality);
$newquality = ($newquality ? $newquality : '100'); // % quality maximum
imagewebp($imgTarget, $imgTargetName, $newquality);
break;
}
@ -334,7 +335,7 @@ function dol_imageResizeOrCrop($file, $mode, $newWidth, $newHeight, $src_x = 0,
// Free memory. This does not delete image.
imagedestroy($img);
imagedestroy($imgThumb);
imagedestroy($imgTarget);
clearstatcache(); // File was replaced by a modified one, so we clear file caches.