Intereting Posts
Regex / DOMDocument – сопоставление и замена текста не в ссылке Supervisord «статус выхода 1 не ожидается» работает сценарий php Как предотвратить распространение почты от спама? Неустранимая ошибка: нельзя использовать смещение строки в виде массива Как безопасно хранить пароли пользователей? PHP импортирует CVS-файл в MySql Несколько OR в php if (), похоже, не реагируют должным образом. Тестируемые значения массива и все. Что я делаю не так? преобразовать часть элемента dom в строку с тегами html внутри них Как запустить одиночный метод тестирования с помощью phpunit? Ajax продолжает возвращать вызывающую страницу Magento – отдельный пользовательский атрибут продукта с массивом значений переменная $ _session Взаимодействие приложений Android с сетью Вызов функции javascript из контроллера codeigniter Вставьте один или несколько наборов полей в базу данных с помощью динамической формы

Как сохранить прозрачный фон в PNG при изменении размера с помощью PHP?

У меня возникла проблема при изменении размера изображений с помощью PHP, особенно с PNG-файлами с прозрачным фоном, вместо этого сохраняя прозрачный фон, он превращается в черный фон. Как я могу это исправить?

Это сценарий для изменения размера:

<?php class resize{ var $image; var $image_type; function load($filename) { $image_info = getimagesize($filename); $this->image_type = $image_info[2]; if( $this->image_type == IMAGETYPE_JPEG ) { $this->image = imagecreatefromjpeg($filename); } elseif( $this->image_type == IMAGETYPE_GIF ) { $this->image = imagecreatefromgif($filename); } elseif( $this->image_type == IMAGETYPE_PNG ) { $this->image = imagecreatefrompng($filename); } } function save($filename, $image_type=IMAGETYPE_JPEG, $compression=85, $permissions=null) { if( $image_type == IMAGETYPE_JPEG ) { imagejpeg($this->image,$filename,$compression); } elseif( $image_type == IMAGETYPE_GIF ) { imagegif($this->image,$filename); } elseif( $image_type == IMAGETYPE_PNG ) { imagepng($this->image,$filename); } if( $permissions != null) { chmod($filename,$permissions); } } function output($image_type=IMAGETYPE_JPEG) { if( $image_type == IMAGETYPE_JPEG ) { imagejpeg($this->image); } elseif( $image_type == IMAGETYPE_GIF ) { imagegif($this->image); } elseif( $image_type == IMAGETYPE_PNG ) { imagepng($this->image); } } function getWidth() { return imagesx($this->image); } function getHeight() { return imagesy($this->image); } function resizeToHeight($height) { $ratio = $height / $this->getHeight(); $width = $this->getWidth() * $ratio; $this->resize($width,$height); } function resizeToWidth($width) { $ratio = $width / $this->getWidth(); $height = $this->getheight() * $ratio; $this->resize($width,$height); } function scale($scale) { $width = $this->getWidth() * $scale/100; $height = $this->getheight() * $scale/100; $this->resize($width,$height); } function resize($width,$height) { $new_image = imagecreatetruecolor($width, $height); imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight()); $this->image = $new_image; } } ?> 

И вот как я это называю:

 $picture_directory="images/" . $_FILES["file"]["name"]; include('arqinc/resizing.php'); $image = new resize(); $image->load($picture_directory); $image->resize(660,780); $image->save($picture_directory); в $picture_directory="images/" . $_FILES["file"]["name"]; include('arqinc/resizing.php'); $image = new resize(); $image->load($picture_directory); $image->resize(660,780); $image->save($picture_directory); 

РЕДАКТИРОВАТЬ:

ive изменила мою функцию изменения размера:

 function resize($width,$height) { $new_image = imagecreatetruecolor($width, $height); $transparent=imagefill($new_image, 0, 0, imagecolorallocatealpha($new_image, 255, 255, 255, 127)); imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight()); $this->image = $new_image; } 

Но теперь он сохраняет фоновый белый, не прозрачный.

EDIT 2:

Решенный, эта функция изменения размера сломана, эта работает безупречно:

http://mediumexposure.com/smart-image-resizing-while-preserving-transparency-php-and-gd-library/

Спасибо Тахиру Ясину за его связь: D

    Я нашел еще одно сообщение с тем же вопросом, согласно этому сообщению следующий код может быть использован для сохранения прозрачности.

     imagealphablending( $targetImage, false ); imagesavealpha( $targetImage, true ); 

    Ссылка. Можно ли сохранить прозрачность изображения PNG при использовании PHP GDlib imagecopyresampled?

    Пожалуйста, проголосуйте, если это поможет вам. 🙂

    Вам нужно использовать imagepng($new_image,$file_name) после imagecopyresampled() кода imagecopyresampled() . замените $ file_name на имя, которое вы хотите сохранить.

    php imagepng() – используется для вывода изображения PNG из созданного изображения

    эта функция работает

     function resize($width,$height) { $new_image = imagecreatetruecolor($width, $height); $transparent=imagefill($new_image, 0, 0, imagecolorallocatealpha($new_image, 255, 255, 255, 127)); imagealphablending($new_image, false); imagesavealpha($new_image, true); imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight()); $this->image = $new_image; }