За последние 24 часа нас посетили 17385 программистов и 1294 робота. Сейчас ищут 1606 программистов ...

Серый фон при ресайзе картинок

Тема в разделе "Прочие вопросы по PHP", создана пользователем Superk, 26 мар 2016.

  1. Superk

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

    С нами с:
    5 фев 2010
    Сообщения:
    32
    Симпатии:
    0
    Что я делаю не так? На всех миниатюрах появляется серый фон. В оригинале фон белый как первый снег.

    Картинки получаются такие: http://magazin-mozaiki.ru

    Код ресайза:
    Код (PHP):
    1. public function resize($filePath, $options = null)
    2.     {
    3.         ini_set('memory_limit', '128M');
    4.         $filePath = (string)$filePath;
    5.  
    6.         $imageFullPath = $this->getFullImagePath($filePath);
    7.  
    8.         if (empty($filePath) OR ! file_exists($imageFullPath)) {
    9.             $imageFullPath = $this->getFullImagePath(ImageProcessor::IMAGE_NOT_FOUND_SRC);
    10.             $filePath = ImageProcessor::IMAGE_NOT_FOUND_SRC;
    11.         }
    12.  
    13.         $options = $this->parseArgs(func_get_args());
    14.  
    15.         extract($options);
    16.  
    17.         $quality = !empty($options['quality']) ? $options['quality'] : 90; # image quality to use for ImageMagick (0 - 100)
    18.  
    19.         $url = $this->getResizedUrl($filePath, $options);
    20.  
    21.         $savePath = BASE_DIR . $url;
    22.  
    23.         if (file_exists($savePath) && filemtime($savePath) > filemtime($imageFullPath))
    24.             return $url;
    25.  
    26.         $src = imagecreatefromstring(file_get_contents($imageFullPath));
    27.  
    28.         $dst_image = $this->resizeSrc($src, $options);
    29.  
    30.         imagedestroy($src);
    31.  
    32.         $thumbFullPath = BASE_DIR . pathinfo($url, PATHINFO_DIRNAME);
    33.  
    34.         if (! file_exists($thumbFullPath))
    35.             mkdir($thumbFullPath, 0777, true);
    36.  
    37.         imagejpeg($dst_image, $savePath, $quality);
    38.  
    39.         imagedestroy($dst_image);
    40.  
    41.         //генерация url на основе пути
    42.         return $url;
    43.     }
    44.  
    45.     public function resizeSrc($src, $options)
    46.     {
    47.         extract($options);
    48.  
    49.         $width = imagesx($src);
    50.         $height = imagesy($src);
    51.         $rate = $width / $height;
    52.  
    53.         $dstX = 0;
    54.         $dstY = 0;
    55.         $cropX = 0;
    56.         $cropY = 0;
    57.  
    58.         if (empty($w) && empty($h)) {
    59.             $dstW = $w = $width; //исходная ширина
    60.             $dstH = $h = $height; //исходная высота
    61.         } else {
    62.             if (empty($w)) {
    63.                 $w = $dstW = $rate * $h;
    64.                 $dstH = $h;
    65.  
    66.                 if ($w > ImageProcessor::MAX_SIZE) {
    67.                     $w = $dstW = ImageProcessor::MAX_SIZE;
    68.                     $h = $dstH = $w / $rate;
    69.                 }
    70.             } else if (empty($h)) {
    71.                 $h = $dstH = $w / $rate;
    72.                 $dstW = $w;
    73.  
    74.                 if ($h > ImageProcessor::MAX_SIZE) {
    75.                     $h = $dstH = ImageProcessor::MAX_SIZE;
    76.                     $w = $dstW = $rate * $h;
    77.                 }
    78.             } else {
    79.                 if (!empty($options['fill'])) { //заполняем фоном
    80.                     if ($w / $h > $rate) {
    81.                         $dstW = $rate * $h;
    82.                         $dstH = $h;
    83.                         $dstX = round(($options['w'] - $dstW) / 2);
    84.                     } else if ($w / $h < $rate) {
    85.                         $dstH = $w / $rate;
    86.                         $dstW = $w;
    87.                         $dstY = round(($options['h'] - $dstH) / 2);
    88.                     } else {
    89.                         $dstH = $h;
    90.                         $dstW = $w;
    91.                     }
    92.                 } else { //Обрезаем картинку
    93.                     $dstW = $w;
    94.                     $dstH = $h;
    95.                     if ($w / $h > $rate) {
    96.                         //наш случай
    97.                         $cropY = round(($height - ($width * $h) / $w) / 2);
    98.                     } else if ($w / $h < $rate) {
    99.                         $cropX = round(($width - $height * ($w / $h)) / 2);
    100.                         //$w = ($width - 2 * $cropX) * $h/$height;
    101.                     }
    102.                 }
    103.             }
    104.         }
    105.  
    106.         $scrW = $width - 2 * $cropX;
    107.         $srcH = $height - 2 * $cropY;
    108.  
    109.         $dst_image = imagecreatetruecolor($w, $h);
    110.  
    111.         if (! $dst_image)
    112.             return false;
    113.  
    114.         imagefill($dst_image, 0, 0, imagecolorallocate($dst_image, 255, 255, 255));
    115.  
    116.         imagecopyresampled($dst_image, $src, $dstX, $dstY, $cropX, $cropY, $dstW, $dstH, $scrW, $srcH);
    117.  
    118.         return $dst_image;
    119.     }
    120.  
    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
     
  2. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    белый или прозрачный?
     
  3. Superk

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

    С нами с:
    5 фев 2010
    Сообщения:
    32
    Симпатии:
    0
    белый... Исходники в jpeg
     
  4. denis01

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

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

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

    С нами с:
    5 фев 2010
    Сообщения:
    32
    Симпатии:
    0
    нагуглил ответ. Проблема в функции GD - imagecopyresampled. Там используется алгоритм обработки, при котором появляется этот фон.
    Попробовал заменить на imagecopyresized(тоже самое, но без обработки). Серый фон исчез, зато сама картинка стала более пиксельной и с ломаными прямыми. В общем шило на мыло.

    Походу надо пробовать imagemagick