Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: GD2 или Image Magick ?
Форумы портала PHP.SU » » Вопросы новичков » GD2 или Image Magick ?

Страниц (1): [1]
 

1. snikers987 - 30 Октября, 2011 - 19:28:07 - перейти к сообщению
Знающие, объясните что всетаки лучше?

Написал код выполняющий одну и туже операцию и с GD2 и с Imagick.

Функция с GD выполняется стабильно 0.7 +- 0.03 сек
А функция с Imagick выполняется по разному от 0.45 до 1.15 сек

Тесты повторил 10 раз , с одним и тем же изображением на *nix хостинге.

Вот задумался о целесообразности использования Imagick
2. DeepVarvar - 30 Октября, 2011 - 19:39:01 - перейти к сообщению
Проверить если маджик есть, юзать маджик, если нет - GD, если ни того ни того - die("Фигвам...");
3. snikers987 - 30 Октября, 2011 - 19:50:52 - перейти к сообщению
Дык есть и то и другое, что лучше?
4. DeepVarvar - 30 Октября, 2011 - 19:54:05 - перейти к сообщению
маджик
5. Champion - 30 Октября, 2011 - 19:59:21 - перейти к сообщению
От потребностей зависит. Если ГД хватает, то ГД. Если картинки портятся, не хватает функционала, то магик.
6. Stierus - 31 Октября, 2011 - 09:43:37 - перейти к сообщению
snikers987,задачи разные бывают. Вы попробуйте провести тест с другим изображением (особенно с большим разрешением, вес не главное, главное - количество точек). Я бы советовал Imagic, потому что в свое время сильно с gd намучался, на каких-то проектах мне и gd с головой хватало.
7. snikers987 - 31 Октября, 2011 - 09:48:56 - перейти к сообщению
Первый пост - изображение было 10 Mpx. Остановился на Imagick, лучшее качество обработки, читабильнее код.
8. Stierus - 31 Октября, 2011 - 10:15:47 - перейти к сообщению
Цитата:
Первый пост - изображение было 10 Mpx
Сколько памяти ждал gd при его обработке (увеличение\уменьшение\наложение watermark) ?
9. snikers987 - 31 Октября, 2011 - 10:34:59 - перейти к сообщению
Точно не знаю, но для проверки того что загружено, ресайза до 400х300 и создания превью 75х57 с GD 32Mb не хватало. GD кричал о не достатке памяти при imagecreatefromjpeg($inputImage);

Imagick + ко всему рисует вотермарк и не жалуется..
(Добавление)
Цитата:
Сколько памяти ждал gd при его обработке


как это собственно можно узнать? Растерялся
11. snikers987 - 31 Октября, 2011 - 17:18:17 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. $start_mem = memory_get_usage(true);
  3. imageResize();
  4. $end_mem = memory_get_usage(true);
  5. $memory = $end_mem - $start_mem;
  6. echo "Used memory: ".$memory."<br/>";


По моим подсчетам GD нужно 5.5 мб.. Для изображения 3648х2736 точек.
GD:

PHP:
скопировать код в буфер обмена
  1. function imageResize($width = 400, $thumbWidth = 75, $savePath = './content/images/', $thumbPath = './content/thumbnail/'){
  2.         //изменяем размер оригинальной картинки
  3.         $newExt = '.jpg';
  4.         $imgext = strrchr(strtolower($_POST['photo_name_1']), ".");
  5.         $imgname = $savePath.$_POST['photo_name_1'];
  6.         list($w,$h,$imgType) = getimagesize($imgname);
  7.         $newImgName = $_POST['photo_name_1'];
  8.         $thumbName = "thumb-".$newImgName;
  9.         switch($imgType) {
  10.                 case "1": $im = imagecreatefromgif($imgname); break;
  11.                 case "2": $im = imagecreatefromjpeg($imgname); break;
  12.                 case "3": $im = imagecreatefrompng($imgname); break;
  13.         }
  14.        
  15.         $new_h=ceil($h/($w/$width));                                                   
  16.         $im1 = imagecreatetruecolor($width, $new_h);
  17.         imagecopyresampled($im1,$im,0,0,0,0,$width,$new_h,imagesx($im),imagesy($im));
  18.         imageconvolution($im1, array(
  19.         array(-1,-1,-1),
  20.         array(-1,16,-1),
  21.         array(-1,-1,-1)
  22.         ), 8, 0);
  23.         imagejpeg($im1, $imgname, 100);
  24.         imagedestroy($im);
  25.         imagedestroy($im1);
  26.                                                
  27.                                                
  28.         $_POST['photo_name_1'] = basename($imgname, $imgext);
  29.         //создаем превью
  30.         $imgp = $thumbPath.basename($thumbName, $imgext).".jpg";
  31.         $newImg = imagecreate(75 , 50);
  32.         imagejpeg ($newImg, $imgp);
  33.         imagedestroy($newImg);
  34.         $im = imagecreatefromjpeg($imgname);
  35.         list($w,$h) = getimagesize($imgname);
  36.         $new_h=ceil($h/($w/$thumbWidth));
  37.         $im1 = imagecreatetruecolor($thumbWidth, $new_h);
  38.         imagecopyresampled($im1,$im,0,0,0,0,$thumbWidth,$new_h,imagesx($im),imagesy($im));
  39.         imageconvolution($im1, array(
  40.         array(-1,-1,-1),
  41.         array(-1,16,-1),
  42.         array(-1,-1,-1)
  43.         ), 8, 0);
  44.         $imgname1 = $thumbPath.basename($thumbName, $imgext).".jpg";
  45.         imagejpeg($im1, $imgname1, 100);
  46.         imagedestroy($im);
  47.         imagedestroy($im1);
  48.         $imgRename = $savePath.basename($imgname, $imgext).$newExt;
  49.         rename($imgname, $imgRename);
  50.  
  51. }


Imagick:

PHP:
скопировать код в буфер обмена
  1.  
  2. function imageResize($width = 400, $thumbWidth = 75, $savePath = './content/images/', $thumbPath = './content/thumbnail/'){
  3.         //$_POST['photo_name_1'] содержит имя загруженого файла
  4.         $text ='Big-Board.in.ua';
  5.         $newExt = '.jpg'; //saved extension
  6.         $imgext = strrchr(strtolower($_POST['photo_name_1']), ".");
  7.         $imgname = $savePath.$_POST['photo_name_1'];
  8.         list($w,$h) = getimagesize($imgname);
  9.         $newImgName = $_POST['photo_name_1'];
  10.         $thumbName = "thumb-".$newImgName;
  11.         $imgRezizedRename = $savePath.basename($imgname, $imgext).$newExt;
  12.         $imgThumbRename = $thumbPath.basename($thumbName, $imgext).$newExt;
  13. //Resize original image
  14.         $new_h=ceil($h/($w/$width));                                                   
  15.         $imgResized = new Imagick($imgname);
  16.         $imgResized->setCompression(Imagick::COMPRESSION_JPEG);
  17.         $imgResized->setCompressionQuality(90);
  18.         $imgResized->setImageFormat('jpeg');
  19.         $imgResized->resizeImage($width,$new_h,Imagick::FILTER_LANCZOS,1);
  20.                 $draw = new ImagickDraw();
  21.                 $color = new ImagickPixel('#6f6e76');
  22.                 $draw->setFillColor($color);
  23.                 $draw->setFontSize(25);
  24.                 $draw->setFillAlpha( 1.0 );
  25.                 //$draw->setFillColor('#000000');
  26.                 $draw->setGravity( Imagick::GRAVITY_SOUTHEAST );
  27.                 $draw->setStrokeAntialias(true);
  28.                 $draw->setTextAntialias(true);
  29.                 //$draw->annotation(0, 40, $text);
  30.                 $imgResized->annotateImage( $draw, 10, 10, 0, $text );
  31.         $imgResized->writeImage($imgRezizedRename);
  32.         $imgResized->clear();
  33.         $imgResized->destroy();
  34.         if($imgext != $newExt) unlink($imgname);
  35.  
  36. //Create preview image
  37.         $new_h=ceil($h/($w/$thumbWidth));                                                      
  38.         $imgResized = new Imagick($imgRezizedRename);
  39.         $imgResized->resizeImage($thumbWidth,$new_h,Imagick::FILTER_LANCZOS,1);
  40.         $imgResized->writeImage($imgThumbRename);
  41.         $imgResized->clear();
  42.         $imgResized->destroy();
  43. //Send new image name, method POST     
  44.         $imageName = basename($imgRezizedRename, $newExt);
  45.         $_POST['photo_name_1'] = $imageName;
  46. }
  47.  


При использовании imagick использованная память == 0 пишет..

ЗЫ: Код не допиленный.
(Добавление)
Попробовал ради эксперимента картинку 7000х7000 GD удавилось, Imagick справился.

 

Powered by ExBB FM 1.0 RC1