Я изменяю размеры нескольких изображений, и иногда image_png занимает 13 секунд, чтобы вернуть изображения, в то время как большинство возвращается через 0-1 секунд. Размер изображения с соотношением сторон 320/480 изменяется на 320×480 за 0 секунд, а до 750×1334 и 1242×2280 за 10-13 секунд.
Замедление происходит не по размеру изображения (0 секунд), а только с помощью функции imagepng.
Код
function generate_image_thumbnail($source_image_path, $thumbnail_image_path,$new_width,$new_height,$opts = Array())
{
$remove_transparency = isset($opts['remove_transparency']) ? $opts['remove_transparency']:false;
list($source_image_width, $source_image_height, $source_image_type) = getimagesize($source_image_path);
switch ($source_image_type) {
case IMAGETYPE_GIF:
$source_gd_image = imagecreatefromgif($source_image_path);
break;
case IMAGETYPE_JPEG:
$source_gd_image = imagecreatefromjpeg($source_image_path);
break;
case IMAGETYPE_PNG:
$source_gd_image = imagecreatefrompng($source_image_path);
break;
}
if ($source_gd_image === false) {
echo "Image Failure: $source_image_path\n";
echo "Image type: ".$source_image_type."\n";
exit();
}
$source_aspect_ratio = $source_image_width / $source_image_height;
$thumbnail_aspect_ratio = $new_width / $new_height;
if ($source_image_width <= $new_width && $source_image_height <= $new_height) {
$thumbnail_image_width = $source_image_width;
$thumbnail_image_height = $source_image_height;
} elseif ($thumbnail_aspect_ratio > $source_aspect_ratio) {
$thumbnail_image_width = (int) ($new_height * $source_aspect_ratio);
$thumbnail_image_height = $new_height;
} else {
$thumbnail_image_width = $new_width;
$thumbnail_image_height = (int) ($new_width / $source_aspect_ratio);
}
$thumbnail_image_height = $new_height;
$thumbnail_image_width = $new_width;
$thumbnail_gd_image = imagecreatetruecolor($thumbnail_image_width, $thumbnail_image_height);
$time = time();
imagecopyresampled($thumbnail_gd_image, $source_gd_image, 0, 0, 0, 0, $thumbnail_image_width, $thumbnail_image_height, $source_image_width, $source_image_height);
$time = time() - $time;
echo "Resample Time: $time\n";
$time = time();
$result = imagepng($thumbnail_gd_image, $thumbnail_image_path, 9);
$time = time() - $time;
echo "Image Time: $time\n";
imagedestroy($source_gd_image);
imagedestroy($thumbnail_gd_image);
if (!file_exists($thumbnail_image_path))
{
var_dump($thumbnail_gd_image);
}
return true;
}
Высокая компрессия на большом изображении требует времени. С этим мало что можно поделать.
Попробуйте снизить уровень сжатия, изменив:
imagepng($thumbnail_gd_image, $thumbnail_image_path, 9);
в
imagepng($thumbnail_gd_image, $thumbnail_image_path, 8); //or another lower value
Я знаю, ответ уже принят. Это может быть полезно для кого-то. Некоторые данные, чтобы подумать о том, как качество изображения влияет на производительность функции imagepng (). Приведенные ниже данные являются результатом проведенных экспериментов с изображением размером 3,1 Мб.
Название «качество» для параметра сжатия вводит в заблуждение,
поскольку сжатие png всегда без потерь. Компромисс между скоростью
и размер файла, это не может повлиять на качество.
imagepng()
Качество изображения (значение) Длительность (сек)
1 —> 0,458
2 —> 0,474
3 —> 0,618
4 —> 0,624
5 —> 0,868
6 —> 1,539
7 —> 2,274
8 —> 7,748
9 —> 13