на сервере работает ресайзинг и обрезка картинок периодически получаются такие картинки http://i.imgur.com/tcuRSb4.jpg http://i.imgur.com/OPEWuT3.jpg или полностью серые или частично, причем если удалить эту битую картинку то новая рендерится нормально вначале работало через ф-ю imagecopyresampled gd затем поставил imagick и использовал ф-ю cropthumbnailimage вылазят ошибки периодически, большинство картинок нормально выводятся в логах ошибок нет в чем может быть проблема? сервак проверял,не нагружен, 4 ядра почти не нагружены,память 600мб из 1500
закиньте проблемные картинки на сервер и из командной строки imagickом порежте эти же картинки с такими же настройками. Если всё отработает нормально, то проблема в вашем коде или настройках выполнения php-скриптов.
оригинал картинки в порядке скрипт работает так-если картинка есть на диске то сервер отдает картинку, если картинки нет то вызывается скрипт который ресайзит оригинал и сохраняет ресайзеную если картинка сохранилась битая,я ее удаляю то при новом ресайзинге картинка генерится без ошибок
ну короче хз, иногда бывает, что картинка открывается без ошибок просто потому что программа-просмотрщик их исправляет.
может скрипт просто накрывается по time limit и файл не дописывается? в другой раз ему может хватить времени, если сервак менее загружен. Добавлено спустя 53 секунды: обработка через imagemagic медленее, чем через gd, отсюда такое предположение. Добавлено спустя 3 минуты 8 секунд: хотя вот встретил оценку: в твоём конкретном случае может и не медленнее ))) меряй, экспериментируй.
проблема с обрезкой была как с gd так и с imagemagic насчет лимита по времени-после обрезки идет вызов сохранения этой картинки так вот картинка всегда сохраняется но только в битом виде
для imagik использую штатную ф-ю cropThumbnailImage для gd использую такую обертку Код (PHP): public function cropResize ($width, $height) { if (!is_numeric($width) || $width == 0) { throw new InvalidArgumentException('$width must be numeric and greater than zero'); } if (!is_numeric($height) || $height == 0) { throw new InvalidArgumentException('$height must be numeric and greater than zero'); } // die('f'); if($this->currentDimensions['width']<=$width && $this->currentDimensions['height']<=$height) { return $this; } $rationOrig=$this->currentDimensions['width']/$this->currentDimensions['height']; if ($width/$height > $rationOrig) { $newHeight = round($width/$rationOrig); $newWidth = $width; } else { $newWidth = round($height*$rationOrig); $newHeight = $height; } $xMid = round($newWidth/2); $yMid = round($newHeight/2); if (function_exists('imagecreatetruecolor')) { $this->workingImage = imagecreatetruecolor($newWidth,$newHeight); } else { $this->workingImage = imagecreate($newWidth, $newHeight); } $this->preserveAlpha(); imagecopyresampled ( $this->workingImage, $this->oldImage, 0, 0, 0, 0, $newWidth, $newHeight, $this->currentDimensions['width'], $this->currentDimensions['height'] ); if (function_exists('imagecreatetruecolor')) { $thumb = imagecreatetruecolor($width,$height); } else { $thumb = imagecreate($width, $height); } imagecopyresampled ( $thumb, $this->workingImage, 0, 0, ($xMid-($width/2)), ($yMid-($height/2)), $width, $height, $width, $height ); $this->oldImage = $thumb; return $this; }