У меня возникла проблема при изменении размера изображений с помощью 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; }