Медленное масштабирование картинок на PHP.
Здравствуйте!
При добавлении объявлении предполагается добавлять 5 фоток.
Происходит это следующим образом:
1. Исходная картинка масштабируется к размеру 400x300px
2. Исходная картинка масштабируется к размеру 80x60px
3. На большую картинку (400x300px) накладывается водяной знак
В итоге получается 10 картинок: 5 больших и 5 - их маленьких аналогов. Все большие картинки имеют водяной знак, маленикие - не имеют его.
Смысл в том, что создаётся галерея товара, сбоку видны маленькие картинки, а тыкнешь на них - подгружается большая картинка для увеличенного просмотра. В общем, всё как и положено. Работает на ура, но... На localhost это занимает 40 секунд! А если пытаетесь сделать это через Интернет - то 1.5-2 минуты... Пользователь может подумать что браузер повис или коннект сдох - и отрубит всё нафиг. Пытался выяснить причину - водяной знак накладывается моментально. Вся проблема - в масштабировании. Именно оно жрёт столько времени.
Хотел было уже аплодить фотки как есть, а уже через crontab каждые минут 5-10 из ресайзить. Но это изврат...
Есть ли выходы?
Делаю так:
// Добавляем данные о тачке в таблицу
INSERT INTO CARS_TABLE VALUES(NULL, ...)...
// Ресайзим картинку 400x300 (flag = 0 - наложить водяной знак)
image_prepare($file, 400, 300, $i, $upload_dir, 0);
// Ресайзим картинку 80x60 (flag = 1 - без водяного знака)
image_prepare('_'.$file, 80, 60, $i, $upload_dir, 1);
Ну а вот и сама ф-я image_prepare():
function image_prepare($file, $w, $h, $i, $upload_dir, $flag) {
$q = 80;
$src = imagecreatefromjpeg($_FILES['photo'.$i]['tmp_name']);
$w_src = imagesx($src);
$h_src = imagesy($src);
$path = $upload_dir.$file;
$w_dest = $w;
$h_dest = $h;
$dest = imagecreatetruecolor($w_dest,$h_dest);
imagecopyresampled($dest, $src, 0, 0, 0, 0, $w_dest, $h_dest, $w_src, $h_src);
if(!file_exists($path)) {
// Нужен водяной знак!
if($flag == 0) {
$water_img = ROOT.'/images/design/watermark.png';
$water_hw = getimagesize($water_img);
$water = imagecreatefrompng($water_img);
imagecopy($dest, $water, 400 - $water_hw[0] - 10, 300 - $water_hw[1] - 10, 0, 0, $water_hw[0], $water_hw[1]);
$res = imagejpeg($dest, $path, $q);
}
else $res = imagejpeg($dest, $path, $q);
imagedestroy($dest);
imagedestroy($src);
}
}
Ну закачку картинок на сервер я пропустил - там ничего особенного...
PS: imagecopyresized() не предлагать! Изображения получаются корявые, в зазубринах, а быстродействие почти не улучшается.
Бюджет назначайте сами.