Что я делаю не так? На всех миниатюрах появляется серый фон. В оригинале фон белый как первый снег. Картинки получаются такие: http://magazin-mozaiki.ru Код ресайза: Код (PHP): public function resize($filePath, $options = null) { ini_set('memory_limit', '128M'); $filePath = (string)$filePath; $imageFullPath = $this->getFullImagePath($filePath); if (empty($filePath) OR ! file_exists($imageFullPath)) { $imageFullPath = $this->getFullImagePath(ImageProcessor::IMAGE_NOT_FOUND_SRC); $filePath = ImageProcessor::IMAGE_NOT_FOUND_SRC; } $options = $this->parseArgs(func_get_args()); extract($options); $quality = !empty($options['quality']) ? $options['quality'] : 90; # image quality to use for ImageMagick (0 - 100) $url = $this->getResizedUrl($filePath, $options); $savePath = BASE_DIR . $url; if (file_exists($savePath) && filemtime($savePath) > filemtime($imageFullPath)) return $url; $src = imagecreatefromstring(file_get_contents($imageFullPath)); $dst_image = $this->resizeSrc($src, $options); imagedestroy($src); $thumbFullPath = BASE_DIR . pathinfo($url, PATHINFO_DIRNAME); if (! file_exists($thumbFullPath)) mkdir($thumbFullPath, 0777, true); imagejpeg($dst_image, $savePath, $quality); imagedestroy($dst_image); //генерация url на основе пути return $url; } public function resizeSrc($src, $options) { extract($options); $width = imagesx($src); $height = imagesy($src); $rate = $width / $height; $dstX = 0; $dstY = 0; $cropX = 0; $cropY = 0; if (empty($w) && empty($h)) { $dstW = $w = $width; //исходная ширина $dstH = $h = $height; //исходная высота } else { if (empty($w)) { $w = $dstW = $rate * $h; $dstH = $h; if ($w > ImageProcessor::MAX_SIZE) { $w = $dstW = ImageProcessor::MAX_SIZE; $h = $dstH = $w / $rate; } } else if (empty($h)) { $h = $dstH = $w / $rate; $dstW = $w; if ($h > ImageProcessor::MAX_SIZE) { $h = $dstH = ImageProcessor::MAX_SIZE; $w = $dstW = $rate * $h; } } else { if (!empty($options['fill'])) { //заполняем фоном if ($w / $h > $rate) { $dstW = $rate * $h; $dstH = $h; $dstX = round(($options['w'] - $dstW) / 2); } else if ($w / $h < $rate) { $dstH = $w / $rate; $dstW = $w; $dstY = round(($options['h'] - $dstH) / 2); } else { $dstH = $h; $dstW = $w; } } else { //Обрезаем картинку $dstW = $w; $dstH = $h; if ($w / $h > $rate) { //наш случай $cropY = round(($height - ($width * $h) / $w) / 2); } else if ($w / $h < $rate) { $cropX = round(($width - $height * ($w / $h)) / 2); //$w = ($width - 2 * $cropX) * $h/$height; } } } } $scrW = $width - 2 * $cropX; $srcH = $height - 2 * $cropY; $dst_image = imagecreatetruecolor($w, $h); if (! $dst_image) return false; imagefill($dst_image, 0, 0, imagecolorallocate($dst_image, 255, 255, 255)); imagecopyresampled($dst_image, $src, $dstX, $dstY, $cropX, $cropY, $dstW, $dstH, $scrW, $srcH); return $dst_image; } Подсказка от модератора: Любой код или текст конфигурации пишите между тегом [code=php] и [/code]. Используйте отступы в коде для форматирования текста. Это помогает быстрее понять вас, увеличивает шанс на получение ответа. Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
нагуглил ответ. Проблема в функции GD - imagecopyresampled. Там используется алгоритм обработки, при котором появляется этот фон. Попробовал заменить на imagecopyresized(тоже самое, но без обработки). Серый фон исчез, зато сама картинка стала более пиксельной и с ломаными прямыми. В общем шило на мыло. Походу надо пробовать imagemagick