imagecreatetruecolor PHP 5

sfairet

Новичок
imagecreatetruecolor PHP 5

imagecreatetruecolor($sizex,$sizey); PHP 5

Очень странно себя ведет:

Ресурс создается не всегда, причем когда не создается не вылетают ни
эксепшены ни прочие ошибки, просто скрипт PHP перестает работать.

Зависит от параметра sizey, и исходной картинки.
Например на двух картинках обе jpg на одной срабатывает на другой нет.

Первая картинка размеров 1280 на 800, ресурс создается размером 620
на 388 успешно.

Вторая картинка 1280 на 960, ресурс создается размером 620 на 465,
скрипт на создании ресурса просто останавливается.

Если во второй картинке вручную задать разрешение создаваемого
ресурса 620 на 350, то она уменьшается успешно.

Причем если для первой картинки вручную задать разрешение ресурса 620
на 500 то она тоже создается успешно.

Не понимаю вообще причем тут картинка исходная, т.к. до неё там дело вообще еще не доходит, но факт что остановка происходит на этой функции.

Голову уже сломал себе что не так...

ну и кусок кода:

PHP:
function Resample(&$img, $owdt, $ohgt, $maxwdt, $maxhgt, $quality=1) {

  if(!$maxwdt) $divwdt=0;
   else $divwdt=Max(1,$owdt/$maxwdt);

  if(!$maxhgt) $divhgt=0;
   else $divhgt=Max(1,$ohgt/$maxhgt);

  if($divwdt>=$divhgt) {
      echo "<br>!!!1!!!<br>";
    $newwdt=$maxwdt;
    $newhgt=round($ohgt/$divwdt);
  } else {
      echo "<br>!!!2!!!<br>";
    $newhgt=$maxhgt;
    $newwdt=round($owdt/$divhgt);
  }
  $newwdt=(int)$newwdt;
  $newhgt=(int)$newhgt;
  echo $newhgt;
  //$newhgt=350;
echo gettype($newwdt).$newwdt.";".gettype($newhgt).$newhgt;
try {
    $tn=imagecreatetruecolor($newwdt,$newhgt) or die('Что то пошло не так, звони админу.'); // ВОТ ТУТ ОБРЫВ
}
  catch (Exception $e) {
    echo 'Выброшено исключение: ',  $e->getMessage(), "<br>";
}
echo "<br>finish<br>";
    if($quality){
  
        imagecopyresampled($tn,$img,0,0,0,0,$newwdt,$newhgt,$owdt,$ohgt);
  
    }    
    else{
  
        imagecopyresized($tn,$img,0,0,0,0,$newwdt,$newhgt,$owdt,$ohgt);
    
    }

    imagedestroy($img);
  
    $img = $tn;

    return array($newwdt, $newhgt);
}

//вызов происходит так:
echo $newimg.";".$owdt.";".$ohgt.";".$otype."<br>";
    $this->Resample($newimg, $owdt, $ohgt, 620, 800);
   echo "finish";
 

sfairet

Новичок
плз подробнее для чайников, этот параметр устанавливается хостером?

и как можно отследить выделенную память на данный момент, и максимально возможную?

Спасибо!

-~{}~ 18.09.08 18:28:

да кстати картинка на которой работает 405 КБ, а вторая 128 КБ
 

sfairet

Новичок
Еще добовление хостер выделяет динамической памяти на скрипты 64Mb
 

sfairet

Новичок
Автор оригинала: HraKK
memory_limit
HraKK был прав, стоял лимит на один скрипт 8 Мб, исправил все работает.
Вообще конечно эта функция хорошо так ресурсы жрет=), чтобы создать картинку 2000 на 1500 пикселей нужно памяти выделить 16Мб.

Всем спасибо!
 

tony2001

TeaM PHPClub
я совершенно точно пишу это уже не в первый раз, но может быть в следующий раз этот топик всё-таки найдётся поиске.
итак, что делает imagecreatetruecolor() - она создаёт матрицу из пикселей размером X*Y плюс матрицу из коэффициентов прозрачности того же размера.

итого получается:
Y*sizeof(int *) + Y*(X*sizeof(int)) + Y*sizeof(char *) + Y*(X*sizeof(char)) + еще немного по мелочи

картинка 2000x1500:
1500*8 + 1500*(2000*4) + 1500*8 + 1500*(2000*1) = 15 024 000 байт

да, GD (в отличие от PECL/imagick или magickwand) использует Zend memory manager и поэтому подпадает под ограничение memory_limit.
 

sfairet

Новичок
а есть вариант уменьшить картинку не занимая столько ресурсов? Ну в смысле какую библиотеку лучше использовать, и если не сложно с небольшим примером.
 

tony2001

TeaM PHPClub
.. что означает только то, что они требуют столько же (если не больше) ресурсов, только PHP об этом не знает.
 
Сверху