Вот функция, которую я написал для создания эскизов с помощью GD. Вы можете передать максимальную ширину или высоту или оба (если нуль означает неограниченное), а уменьшенный размер будет масштабироваться до $dest
(+ расширение файла) с сохраненными пропорциями. Он также работает с прозрачными изображениями. Любое дополнительное пространство должно быть полностью прозрачным; Если вам нужен другой фон, измените $img
до imagecopyresampled()
.
function picThumb($src, $dest, $width = 0, $height = 0, $quality = 100)
{
$srcType = exif_imagetype($src);
if (!$width && !$height)
{
$ext = image_type_to_extension($srcType, false);
copy($src, $dest . '.' . $ext);
return $ext;
}
ini_set('memory_limit', '134217728');
try
{
switch ($srcType)
{
case IMAGETYPE_JPEG:
$srcImg = imagecreatefromjpeg($src);
break;
case IMAGETYPE_PNG:
$srcImg = imagecreatefrompng($src);
break;
case IMAGETYPE_GIF:
$srcImg = imagecreatefromgif($src);
break;
default:
throw new Exception();
}
$srcWidth = imagesx($srcImg);
$srcHeight = imagesy($srcImg);
if (!$srcWidth || !$srcHeight)
{
throw new Exception();
}
if ($width && $height)
{
$ratio = min($srcWidth/$width, $srcHeight/$height);
$areaWidth = round($width * $ratio);
$areaHeight = round($height * $ratio);
$areaX = round(($srcWidth - $areaWidth)/2);
$areaY = round(($srcHeight - $areaHeight)/2);
}
else // if (!$width || !$height)
{
if ($width)
{
$height = round($width/$srcWidth * $srcHeight);
}
else // if ($height)
{
$width = round($height/$srcHeight * $srcWidth);
}
$areaWidth = $srcWidth;
$areaHeight = $srcHeight;
$areaX = 0;
$areaY = 0;
}
$img = imagecreatetruecolor($width, $height);
imagealphablending($img, false);
imagecopyresampled($img, $srcImg, 0, 0, $areaX, $areaY, $width, $height, $areaWidth, $areaHeight);
switch ($srcType)
{
case IMAGETYPE_JPEG:
$ext = 'jpg';
imagejpeg($img, $dest . '.' . $ext, $quality);
break;
case IMAGETYPE_PNG:
case IMAGETYPE_GIF:
$ext = 'png';
imagesavealpha($img, true);
imagepng($img, $dest . '.' . $ext, 9);
break;
default:
throw new Exception();
}
imagedestroy($srcImg);
imagedestroy($img);
}
catch (Exception $e)
{
ini_restore('memory_limit');
throw $e;
}
ini_restore('memory_limit');
return $ext;
}
Это не очень понятно. Не могли бы вы либо переформулировать то, что вам нужно, либо дать некоторые наглядные примеры или что-то еще? – JakeParis
Я второй, что @JMC сказал, особенно как должны обрабатываться пропорции. – Trufa