За последние 24 часа нас посетили 38311 программистов и 1811 роботов. Сейчас ищут 1143 программиста ...

обрезание картинок

Тема в разделе "PHP для новичков", создана пользователем vikrorpert, 3 мар 2016.

  1. vikrorpert

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

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    на сервере работает ресайзинг и обрезка картинок
    периодически получаются такие картинки
    http://i.imgur.com/tcuRSb4.jpg
    http://i.imgur.com/OPEWuT3.jpg

    или полностью серые или частично, причем если удалить эту битую картинку то новая рендерится нормально
    вначале работало через ф-ю imagecopyresampled gd
    затем поставил imagick и использовал ф-ю cropthumbnailimage
    вылазят ошибки периодически, большинство картинок нормально выводятся
    в логах ошибок нет
    в чем может быть проблема?
    сервак проверял,не нагружен, 4 ядра почти не нагружены,память 600мб из 1500
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Может нужно обновить библиотеки
     
  3. vikrorpert

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

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    imagick только сегодня установлен
     
  4. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    закиньте проблемные картинки на сервер и из командной строки imagickом порежте эти же картинки с такими же настройками. Если всё отработает нормально, то проблема в вашем коде или настройках выполнения php-скриптов.
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    оригинал картинки проверял? она могла такой и быть
     
  6. vikrorpert

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

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    оригинал картинки в порядке
    скрипт работает так-если картинка есть на диске то сервер отдает картинку, если картинки нет то вызывается скрипт который ресайзит оригинал и сохраняет ресайзеную
    если картинка сохранилась битая,я ее удаляю то при новом ресайзинге картинка генерится без ошибок
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну короче хз, иногда бывает, что картинка открывается без ошибок просто потому что программа-просмотрщик их исправляет.
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    может скрипт просто накрывается по time limit и файл не дописывается? в другой раз ему может хватить времени, если сервак менее загружен.

    Добавлено спустя 53 секунды:
    обработка через imagemagic медленее, чем через gd, отсюда такое предположение.

    Добавлено спустя 3 минуты 8 секунд:
    хотя вот встретил оценку:
    в твоём конкретном случае может и не медленнее ))) меряй, экспериментируй.
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а оно вроде не считается временем скрипта, если происходит в расширении. Или я не прав?
     
  10. vikrorpert

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

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    проблема с обрезкой была как с gd так и с imagemagic
    насчет лимита по времени-после обрезки идет вызов сохранения этой картинки
    так вот картинка всегда сохраняется но только в битом виде
     
  11. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну то есть картинка битая?
     
  12. vikrorpert

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

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    иногда после ресайзинга картинка битая получается,но не всегда и не регулярно
     
  13. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    речь об одной и той же исходной картинке?
     
  14. vikrorpert

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

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    исходных картинок много
    из одной и той же картинки может получиться или нормальный ресайз или битый
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    точно?
     
  16. vikrorpert

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

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
  17. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    vikrorpert, может код покажешь?
     
  18. vikrorpert

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

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    для imagik использую штатную ф-ю cropThumbnailImage

    для gd использую такую обертку
    Код (PHP):
    1. public function cropResize ($width, $height)
    2. {
    3.    if (!is_numeric($width) || $width  == 0)
    4.    {
    5.       throw new InvalidArgumentException('$width must be numeric and greater than zero');
    6.    }
    7.  
    8.    if (!is_numeric($height) || $height == 0)
    9.    {
    10.       throw new InvalidArgumentException('$height must be numeric and greater than zero');
    11.    }
    12.  
    13. // die('f');
    14.    if($this->currentDimensions['width']<=$width && $this->currentDimensions['height']<=$height)
    15.    {
    16.       return $this;
    17.    }
    18.    
    19.    $rationOrig=$this->currentDimensions['width']/$this->currentDimensions['height'];
    20.    
    21.    
    22.    if ($width/$height > $rationOrig)
    23.    {
    24.       $newHeight = round($width/$rationOrig);
    25.       $newWidth  = $width;
    26.    }
    27.    else
    28.    {
    29.       $newWidth  = round($height*$rationOrig);
    30.       $newHeight = $height;
    31.    }
    32.    
    33.    $xMid = round($newWidth/2);
    34.    $yMid = round($newHeight/2);
    35.    
    36.    
    37.    if (function_exists('imagecreatetruecolor'))
    38.    {
    39.       $this->workingImage = imagecreatetruecolor($newWidth,$newHeight);
    40.    }
    41.    else
    42.    {
    43.       $this->workingImage = imagecreate($newWidth, $newHeight);
    44.    }
    45.    
    46.    $this->preserveAlpha();
    47.    
    48.    (
    49.       $this->workingImage,
    50.       $this->oldImage,
    51.       0,
    52.       0,
    53.       0,
    54.       0,
    55.       $newWidth,
    56.       $newHeight,
    57.       $this->currentDimensions['width'],
    58.       $this->currentDimensions['height']
    59.    );
    60.    
    61.    if (function_exists('imagecreatetruecolor'))
    62.    {
    63.       $thumb = imagecreatetruecolor($width,$height);
    64.    }
    65.    else
    66.    {
    67.       $thumb = imagecreate($width, $height);
    68.    }
    69.       
    70.    (
    71.       $thumb,
    72.       $this->workingImage,
    73.       0,
    74.       0,
    75.       ($xMid-($width/2)),
    76.       ($yMid-($height/2)),
    77.       $width,
    78.       $height,
    79.       $width,
    80.       $height
    81.    );
    82.    
    83.    $this->oldImage                = $thumb;
    84.    
    85.    return $this;
    86. }