Здравствуйте!

При добавлении объявлении предполагается добавлять 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() не предлагать! Изображения получаются корявые, в зазубринах, а быстродействие почти не улучшается.

Бюджет назначайте сами.

15 лет назад
mikki11
42 года
15 лет в сервисе
Был
год назад

Заявки фрилансеров

Нет заявок фрилансеров