MbIJIO
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Добрый день. Возникла проблема при ресайзе изображений .png Это оригинал, фон прозрачный а получилась вот такая картинка, фон белый, но появилось искажение. Это в опенкарте 2.0.3.1, используется gd Создание картинки Код: private function create($image) { $mime = $this->info['mime']; if ($mime == 'image/gif') { return imagecreatefromgif($image); } elseif ($mime == 'image/png') { return imagecreatefrompng($image); } elseif ($mime == 'image/jpeg') { return imagecreatefromjpeg($image); } } | Изменение размера Код: public function resize($width = 0, $height = 0, $default = '') { if (!$this->info['width'] || !$this->info['height']) { return; } $xpos = 0; $ypos = 0; $scale = 1; $scale_w = $width / $this->info['width']; $scale_h = $height / $this->info['height']; if ($default == 'w') { $scale = $scale_w; } elseif ($default == 'h'){ $scale = $scale_h; } else { $scale = min($scale_w, $scale_h); } if ($scale > 1 && $width > 200) return; if ($scale == 1 && $scale_h == $scale_w && $this->info['mime'] != 'image/png') { return; } $new_width = (int)($this->info['width'] * $scale); $new_height = (int)($this->info['height'] * $scale); $xpos = (int)(($width - $new_width) / 2); $ypos = (int)(($height - $new_height) / 2); $image_old = $this->image; $this->image = imagecreatetruecolor($width, $height); if (isset($this->info['mime']) && $this->info['mime'] == 'image/png') { imagealphablending($this->image, false); imagesavealpha($this->image, true); $background = imagecolorallocatealpha($this->image, 255, 255, 255, 127); imagecolortransparent($this->image, $background); } else { $background = imagecolorallocate($this->image, 255, 255, 255); } imagefilledrectangle($this->image, 0, 0, $width, $height, $background); imagecopyresampled($this->image, $image_old, $xpos, $ypos, 0, 0, $new_width, $new_height, $this->info['width'], $this->info['height']); imagedestroy($image_old); $this->info['width'] = $width; $this->info['height'] = $height; } | Подскажите пожалуйста, как решить эту проблему? Добавлено: как оказалось, дело не в ресайзе, а в его отсутствии. то есть что получилось у меня: исходная картинка была размером 500х500 с прозрачным фоном результирующая должна была получиться 1000х1000 код, который я представил выше из класса Image Это очередность вызовов функций Код: $image = new Image(DIR_IMAGE . $old_image); if ($width_orig != $width || $height_orig != $height) { $image->resize($width, $height); } if ($width > 200 && !$not_available) $image->watermark(DIR_IMAGE . 'watermark.png'); $image->save(DIR_IMAGE . $new_image); | и так, создавал класс Image, в нем открывалась картинка далее должен был быть вызов функции resize. Вызов происходил, но не доходил до конца, вылетал без изменения размеров на условии Код: if ($scale > 1 && $width > 200) return; | Дальше добавлялся вод.знак и потом сохранялся. Собственно, я переделал чуть функцию, и если срабатывало условие, то задавал размеры этой самой картинки Код: if ($scale > 1 && $width > 200){ $width = $this->info['width']; $height = $this->info['height']; $scale_w = $width / $this->info['width']; $scale_h = $height / $this->info['height']; if ($default == 'w') { $scale = $scale_w; } elseif ($default == 'h'){ $scale = $scale_h; } else { $scale = min($scale_w, $scale_h); } } | Ресайз проходил до конца и происходило сохранение нормальной картинки без искажений. вот только не понятно почему из открытой картинки в первый раз, сохранялось с искажениями. |