Посоветуйте, как оптимизировать функцию изменения размера фоток. Оптимизировать надо как по времени, чтобы быстрее картинки изменялись, так и чтобы меньше памяти бралось при данной операции, т.к. периодически выскакивает ошибка "Fatal error: Out of memory (allocated 67895296) (tried to allocate 3072 bytes) in " Функция такая: Код (Text): function CroppedThumbnail($imgSrc,$destSrc,$thumbnail_width,$thumbnail_height) { //getting the image dimensions list($width_orig, $height_orig) = getimagesize($imgSrc); $myImage = imagecreatefromjpeg($imgSrc); $ratio_orig = $width_orig/$height_orig; if ($thumbnail_width/$thumbnail_height > $ratio_orig) { $new_height = $thumbnail_width/$ratio_orig; $new_width = $thumbnail_width; } else { $new_width = $thumbnail_height*$ratio_orig; $new_height = $thumbnail_height; } $x_mid = $new_width/2; //horizontal middle $y_mid = $new_height/2; //vertical middle $process = imagecreatetruecolor(round($new_width), round($new_height)); imagecopyresampled($process, $myImage, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig); $thumb = imagecreatetruecolor($thumbnail_width, $thumbnail_height); if( imagecopyresampled($thumb, $process, 0, 0, ($x_mid-($thumbnail_width/2)), ($y_mid-($thumbnail_height/2)), $thumbnail_width, $thumbnail_height, $thumbnail_width, $thumbnail_height)) { imagejpeg($thumb, $destSrc); imagedestroy($process); imagedestroy($myImage); imagedestroy($thumb); //return $thumb; } else { return false; } }
тут есть http://www.php.ru/forum/viewtopic.php?t=19244 хотя памяти возможно сожрет больше. Экспериментируй =)
Мда, с памятью у меня тут вообще проблемы. Всегда при работе с изображением используется столько памяти?
Не всегда. Возможно тебе есть смысл копнуть в сторону cgi. http://www.hidekik.com/en/rszim/rszim.html к примеру
Простой метод быстрого резайса -- imagecopyresized Тут не происходит интерполяции Потребление памяти никак не снизить: похоже вы слишком большие файлы загружаете, выход только один -- увеличить колво памяти для РНР. Чтобы резайс работал быстро нужно использовать GPU/CUDA, и не обязательно через CGI, если сервак позволяет, можно пользоваться обычными c++ консольными приложениями, например, imagemagick. Но проблема в том что imagemagick умеет всё, но кое-как, и работает в 3 раза медленнее GD. Вывод - поискать быструю консольную картинкосжималку и дергать её через exec.
dhel jpeg файл размером в 1 Мб может разжиматься при ресайзе до много-много мегабайт + ещё сам пхп потребляет память + нужна память для выходного изображения + память для сжатия выходного изображения обратно в jpeg. это так, навскидку. как пример, знаю jpeg-изображения размеров в 87 Кб, разжимающегося в bmp 3.5 Мб.
это понятно, что jpg разжимается, вопрос в том как уменьшить потребление памяти и убыстрить процесс изменения размеров.
Глядела. Там предлагается сперва делать imagecopyresized вместо imagecopyresampled, а потом уже его пользовать imagecopyresampled. У меня время - это вторичная проблема, вернее главная, но пока надо с другим порешать а именно с ошибко Fatal error: Out of memory (allocated 67895296) (tried to allocate 12288 bytes) Все время хостинг просить не охота увеличить память.
dhel 1) на какой именно функции вылетает ошибка? 2) а если просить пользователей не загружать шибко большие фотки? 64мб это дофига 3) проверьте функцией memory_get_usage(), сколько памяти занято ДО вызова той функции, на которой вылетает ошибка и вообще до начала обработки изображения. Может память грузится еще в другом месте.
dhel ваша единственная проблема - малый лимит памяти а хостинге. Из чего я делаю выводы, что вы либо неправильно настроили свой сервер, либо пользуетесь "жадным" хостингом, либо, как я и Gromo уже говорили, картинка 1 мб распаковывается во все 100 (1 мб жпег фотка с 10-мегапиксельного фотоаппарата требует 50 мегабайт памяти при самом оптимистичном раскладе). Я в таком случае рекомендую использовать либо внешнее приложение либо imagemagick через апи (в РНР он есть).
Хостинг купленный, и видимо жадный. imagemagick через апи - можно ссылку? imagemagick надо на хостинг ставить? 2) а если просить пользователей не загружать шибко большие фотки? 64мб это дофига Не получится. 1) и 3) проверю, отпишусь.
http://php.net/manual/en/book.imagick.html Если его нет на хостинге - значит не судьба. Пробуйте system - не работает - совсем труба.
А что такое system? Я php только начала изучать и еще в терминологии плаваю. Fatal error удалось избежать, благодаря memory_get_usage(), нашла, где утекала память, та фотка обработалась. Щас пробую на всем объеме прогнать. Хостинг сказал, что память не увеличит.