За последние 24 часа нас посетили 21084 программиста и 1627 роботов. Сейчас ищут 875 программистов ...

оптимизация изменения размера картинок?

Тема в разделе "Обработка изображений средствами PHP", создана пользователем dhel, 19 фев 2011.

  1. dhel

    dhel Активный пользователь

    С нами с:
    18 май 2008
    Сообщения:
    10
    Симпатии:
    0
    Посоветуйте, как оптимизировать функцию изменения размера фоток. Оптимизировать надо как по времени, чтобы быстрее картинки изменялись, так и чтобы меньше памяти бралось при данной операции, т.к. периодически выскакивает ошибка "Fatal error: Out of memory (allocated 67895296) (tried to allocate 3072 bytes) in "
    Функция такая:
    Код (Text):
    1.  
    2. function CroppedThumbnail($imgSrc,$destSrc,$thumbnail_width,$thumbnail_height) {
    3.     //getting the image dimensions
    4.     list($width_orig, $height_orig) = getimagesize($imgSrc);  
    5.     $myImage = imagecreatefromjpeg($imgSrc);
    6.     $ratio_orig = $width_orig/$height_orig;
    7.    
    8.     if ($thumbnail_width/$thumbnail_height > $ratio_orig) {
    9.        $new_height = $thumbnail_width/$ratio_orig;
    10.        $new_width = $thumbnail_width;
    11.     } else {
    12.        $new_width = $thumbnail_height*$ratio_orig;
    13.        $new_height = $thumbnail_height;
    14.     }
    15.    
    16.     $x_mid = $new_width/2;  //horizontal middle
    17.     $y_mid = $new_height/2; //vertical middle
    18.    
    19.     $process = imagecreatetruecolor(round($new_width), round($new_height));
    20.    
    21.     imagecopyresampled($process, $myImage, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig);
    22.     $thumb = imagecreatetruecolor($thumbnail_width, $thumbnail_height);
    23.     if( imagecopyresampled($thumb, $process, 0, 0, ($x_mid-($thumbnail_width/2)), ($y_mid-($thumbnail_height/2)), $thumbnail_width, $thumbnail_height, $thumbnail_width, $thumbnail_height))
    24.     {
    25.         imagejpeg($thumb, $destSrc);
    26.         imagedestroy($process);
    27.         imagedestroy($myImage);
    28.         imagedestroy($thumb);
    29.     //return $thumb;
    30.     }
    31.     else
    32.     {
    33.         return false;
    34.     }
    35. }
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
  3. dhel

    dhel Активный пользователь

    С нами с:
    18 май 2008
    Сообщения:
    10
    Симпатии:
    0
    Мда, с памятью у меня тут вообще проблемы. Всегда при работе с изображением используется столько памяти?
     
  4. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
  5. <?=RPG?>

    <?=RPG?> Активный пользователь

    С нами с:
    19 ноя 2010
    Сообщения:
    451
    Симпатии:
    0
    Простой метод быстрого резайса -- imagecopyresized
    Тут не происходит интерполяции

    Потребление памяти никак не снизить: похоже вы слишком большие файлы загружаете, выход только один -- увеличить колво памяти для РНР.

    Чтобы резайс работал быстро нужно использовать GPU/CUDA, и не обязательно через CGI, если сервак позволяет, можно пользоваться обычными c++ консольными приложениями, например, imagemagick. Но проблема в том что imagemagick умеет всё, но кое-как, и работает в 3 раза медленнее GD. Вывод - поискать быструю консольную картинкосжималку и дергать её через exec.
     
  6. dhel

    dhel Активный пользователь

    С нами с:
    18 май 2008
    Сообщения:
    10
    Симпатии:
    0
    Файл не большой, всего 1mb.
     
  7. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    dhel
    jpeg файл размером в 1 Мб может разжиматься при ресайзе до много-много мегабайт + ещё сам пхп потребляет память + нужна память для выходного изображения + память для сжатия выходного изображения обратно в jpeg.

    это так, навскидку. как пример, знаю jpeg-изображения размеров в 87 Кб, разжимающегося в bmp 3.5 Мб.
     
  8. dhel

    dhel Активный пользователь

    С нами с:
    18 май 2008
    Сообщения:
    10
    Симпатии:
    0
    это понятно, что jpg разжимается, вопрос в том как уменьшить потребление памяти и убыстрить процесс изменения размеров.
     
  9. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
  10. dhel

    dhel Активный пользователь

    С нами с:
    18 май 2008
    Сообщения:
    10
    Симпатии:
    0
    Глядела. Там предлагается сперва делать imagecopyresized вместо imagecopyresampled, а потом уже его пользовать imagecopyresampled. У меня время - это вторичная проблема, вернее главная, но пока надо с другим порешать а именно с ошибко Fatal error: Out of memory (allocated 67895296) (tried to allocate 12288 bytes) Все время хостинг просить не охота увеличить память.
     
  11. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    dhel
    а сколько памяти жрёт пхп при ресайзе изображения размером 100х100 пикселей?
     
  12. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    dhel
    1) на какой именно функции вылетает ошибка?
    2) а если просить пользователей не загружать шибко большие фотки? 64мб это дофига
    3) проверьте функцией memory_get_usage(), сколько памяти занято ДО вызова той функции, на которой вылетает ошибка и вообще до начала обработки изображения. Может память грузится еще в другом месте.
     
  13. <?=RPG?>

    <?=RPG?> Активный пользователь

    С нами с:
    19 ноя 2010
    Сообщения:
    451
    Симпатии:
    0
    dhel ваша единственная проблема - малый лимит памяти а хостинге. Из чего я делаю выводы, что вы либо неправильно настроили свой сервер, либо пользуетесь "жадным" хостингом, либо, как я и Gromo уже говорили, картинка 1 мб распаковывается во все 100 (1 мб жпег фотка с 10-мегапиксельного фотоаппарата требует 50 мегабайт памяти при самом оптимистичном раскладе).

    Я в таком случае рекомендую использовать либо внешнее приложение либо imagemagick через апи (в РНР он есть).
     
  14. dhel

    dhel Активный пользователь

    С нами с:
    18 май 2008
    Сообщения:
    10
    Симпатии:
    0
    Хостинг купленный, и видимо жадный. imagemagick через апи - можно ссылку? imagemagick надо на хостинг ставить?

    2) а если просить пользователей не загружать шибко большие фотки? 64мб это дофига
    Не получится.

    1) и 3) проверю, отпишусь.
     
  15. <?=RPG?>

    <?=RPG?> Активный пользователь

    С нами с:
    19 ноя 2010
    Сообщения:
    451
    Симпатии:
    0
  16. dhel

    dhel Активный пользователь

    С нами с:
    18 май 2008
    Сообщения:
    10
    Симпатии:
    0
    А что такое system? Я php только начала изучать и еще в терминологии плаваю.

    Fatal error удалось избежать, благодаря memory_get_usage(), нашла, где утекала память, та фотка обработалась. Щас пробую на всем объеме прогнать.

    Хостинг сказал, что память не увеличит.