Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > imagecreatetruecolor потребляет памяти


Автор: ArNic 9.2.2010, 13:56
использую такую функцию на хостинге:

Код

function imageresize($outfile,$infile,$neww=false,$newh=false,$quality=100){
        list($imgw,$imgh,$type)=getimagesize($infile);
        if($type==1) $im=imagecreatefromgif($infile);
        elseif($type==2) $im=imagecreatefromjpeg($infile);
        elseif($type==3) $im=imagecreatefrompng($infile);
        if(@$im){
            if($neww=='auto'){$neww=($newh/$imgh)*$imgw;}
            if($newh=='auto'){$newh=($neww/$imgw)*$imgh;}
            if(!$neww)$neww=$imgw;
            if(!$newh)$newh=$imgh;
            $im1=imagecreatetruecolor($neww,$newh);
            imagecopyresampled($im1,$im,0,0,0,0,$neww,$newh,imagesx($im),imagesy($im));
            imagejpeg($im1,$outfile,$quality);
            imagedestroy($im);
            imagedestroy($im1);
            return true;
        }
}

Для безопасности ресайзю и оригинальные картинки перед заливкой (которые превышают размер 2000 пикс.)
Получаю на выходе 
Цитата
PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 11264 bytes)

Т.к. скрипт на хостинге. Я не могу выделить больше памяти.

читал посты 
http://forum.vingrad.ru/topic-233887.html
http://forum.vingrad.ru/topic-139412.html

Вопрос :
Что откорректировать в функции, чтобы память не жрало так много. 

Автор: Fortop 9.2.2010, 15:36
Цитата(ArNic @  9.2.2010,  12:56 Найти цитируемый пост)
Что откорректировать в функции, чтобы память не жрало так много. 

1. Уменьшить линейные размеры изображения.
2. не использовать цвета TrueColor (пользоваться обычным imagecreate)

Автор: Ипатьев 9.2.2010, 15:42
Цитата(Fortop @  9.2.2010,  15:36 Найти цитируемый пост)
1. Уменьшить линейные размеры изображения.

как это?
Цитата(Fortop @  9.2.2010,  15:36 Найти цитируемый пост)
2. не использовать цвета TrueColor (пользоваться обычным imagecreate)

И получить на выходе бяку.
Это не вариант


Автор: Fortop 9.2.2010, 15:47
Цитата(Ипатьев @  9.2.2010,  14:42 Найти цитируемый пост)
как это?

не пытаться обрабатывать картинки 1000*1000 или 2000 пикселей как у ТС.
Ограничится теми размерами которые помещаются в имеющуюся память.

Цитата(Ипатьев @  9.2.2010,  14:42 Найти цитируемый пост)
И получить на выходе бяку.
Это не вариант

Да, не вариант.
Я не посмотрел что идет именно ресайз.

Есть еще один вариант.
Как палиатив - можно пользоваться существующими image-хостингами как сервисами и переложить функцию ресайза (а возможно и хранения) картинок на них.

Автор: Ипатьев 9.2.2010, 15:57
Цитата(ArNic @  9.2.2010,  13:56 Найти цитируемый пост)
Что откорректировать в функции, чтобы память не жрало так много. 

Если речь идет о том, чтобы привести картинку 3000х3000 к размеру 2000х2000, и ошибка вылетает уже на создании новой картинки, а даже не на ресайзе, то ничего.
можно вызвать  imagemagick через system()

я только не понял, при чем здесь безопасность

Автор: skyboy 9.2.2010, 15:59
если использовать для ресайза imgemagick, то там можно http://www.imagemagick.org/script/command-line-options.php#limit используюмую для ресайза память. 

Автор: IgorIV 9.2.2010, 20:52
Цитата(Ипатьев @  9.2.2010,  15:57 Найти цитируемый пост)
я только не понял, при чем здесь безопасность

Боится, что в комментариях в картинке можно написать вредный код, который потом исполнится на сервере.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)