Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » искажение картинок .png

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

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);
                }
            }
 
 
Ресайз проходил до конца и происходило сохранение нормальной картинки без искажений.
 
вот только не понятно почему из открытой картинки в первый раз, сохранялось с искажениями.

Всего записей: 175 | Зарегистр. 12-12-2006 | Отправлено: 13:16 22-01-2016
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » искажение картинок .png


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru