Использую такой код для изменения размера картинки в формате PNG-24 $new_img = imagecreatetruecolor($w, $h); $image = imagecreatefrompng($d_img); imagecopyresampled($new_img, $image, 0, 0, 0, 0, $w, $h, 90, 90); $trans = imagecolorat($new_img,0,0); imagecolortransparent($new_img,$trans); Получается прозрачность как у GIF-а, т.е. края рубленные, т.к. только один цвет делаю прозрачным. Подскажите пожалуйста как сделать "красиво", сохраня палитру прозрачности?
Незнаю, не пробовал честно говоря. Но вообще, если вам _важно_ качество, лучше юзать что-то получше чем GD2. А так попробуйте, может поможет.
тяжелее но вроде для одноразового использования вроде как и лучше чем GD (хотя в этом вопросе уж больно хочется послушать того же 440Hz )
ImageMagic точно лучше, в ней и возможностей поболее, т.к. это внешняя библиотека, к которой нету модуля для PHP - придёться извращаться с системными вызовами через system.
Брал с двух разных источников, потом собрал все в кучу resize_class_transparent.php Код (Text): <?php class Resize_Image { var $image_to_resize; var $new_width; var $new_height; var $ratio; var $new_image_name; var $save_folder; function setTransparency($new_image, $image_source) { $transparencyIndex = imagecolortransparent($image_source); $transparencyColor = array('red' => 255, 'green' => 255, 'blue' => 255); if ($transparencyIndex >= 0) $transparencyColor = imagecolorsforindex($image_source, $transparencyIndex); $transparencyIndex = imagecolorallocate($new_image, $transparencyColor['red'], $transparencyColor['green'], $transparencyColor['blue']); imagefill($new_image, 0, 0, $transparencyIndex); imagecolortransparent($new_image, $transparencyIndex); } function resize() { if(!file_exists($this->image_to_resize)) { exit("File ".$this->image_to_resize." does not exist."); } $info = GetImageSize($this->image_to_resize); if(empty($info)) { exit("The file ".$this->image_to_resize." doesn't seem to be an image."); } $width = $info[0]; $height = $info[1]; $mime = $info['mime']; /* Keep Aspect Ratio? */ if($this->ratio) { // if preserving the ratio, only new width or new height // is used in the computation. if both // are set, use width if (isset($this->new_width)) { $factor = (float)$this->new_width / (float)$width; $this->new_height = $factor * $height; } else if (isset($this->new_height)) { $factor = (float)$this->new_height / (float)$height; $this->new_width = $factor * $width; } else exit("?neither new height or new width has been set"); } // What sort of image? $type = substr(strrchr($mime, '/'), 1); switch ($type) { case 'jpeg': $image_create_func = 'ImageCreateFromJPEG'; $image_save_func = 'ImageJPEG'; $new_image_ext = 'jpg'; break; case 'png': $image_create_func = 'ImageCreateFromPNG'; $image_save_func = 'ImagePNG'; $new_image_ext = 'png'; break; case 'bmp': $image_create_func = 'ImageCreateFromBMP'; $image_save_func = 'ImageBMP'; $new_image_ext = 'bmp'; break; case 'gif': $image_create_func = 'ImageCreateFromGIF'; $image_save_func = 'ImageGIF'; $new_image_ext = 'gif'; break; case 'vnd.wap.wbmp': $image_create_func = 'ImageCreateFromWBMP'; $image_save_func = 'ImageWBMP'; $new_image_ext = 'bmp'; break; case 'xbm': $image_create_func = 'ImageCreateFromXBM'; $image_save_func = 'ImageXBM'; $new_image_ext = 'xbm'; break; default: $image_create_func = 'ImageCreateFromJPEG'; $image_save_func = 'ImageJPEG'; $new_image_ext = 'jpg'; } // New Image if ($new_image_ext == 'png' || $new_image_ext == 'gif' ) { echo ("прозрачный!!!"); $image_c = ImageCreateTrueColor($this->new_width, $this->new_height); $new_image = $image_create_func($this->image_to_resize); $this->setTransparency($image_c, $new_image); ImageCopyResampled($image_c, $new_image , 0, 0, 0, 0, $this->new_width, $this->new_height, $width, $height); } else { $image_c = ImageCreateTrueColor($this->new_width, $this->new_height); $new_image = $image_create_func($this->image_to_resize); ImageCopyResampled($image_c, $new_image, 0, 0, 0, 0, $this->new_width, $this->new_height, $width, $height); } if($this->save_folder) { if($this->new_image_name) { $new_name = $this->new_image_name.'.'.$new_image_ext; } else { $new_name = $this->new_thumb_name( basename($this->image_to_resize) ).'_resized.'.$new_image_ext; } $save_path = $this->save_folder.$new_name; } else { /* Show the image without saving it to a folder */ header("Content-Type: ".$mime); $image_save_func($image_c); $save_path = ''; } $process = $image_save_func($image_c, $save_path); return array('result' => $process, 'new_file_path' => $save_path); } function new_thumb_name($filename) { $string = trim($filename); $string = strtolower($string); $string = trim(ereg_replace("[^ A-Za-z0-9_]", " ", $string)); $string = ereg_replace("[ tnr]+", "_", $string); $string = str_replace(" ", '_', $string); $string = ereg_replace("[ _]+", "_", $string); return $string; } } ?> index.php Код (Text): <?php include 'resize_class_transparent.php'; $image = new Resize_Image; $image->new_width = 200; $image->new_height = 200; $image->image_to_resize = "temp.png"; // Full Path to the file $image->ratio = true; // Keep Aspect Ratio? // Name of the new image (optional) - If it's not set a new will be added automatically $image->new_image_name =md5(date('U')); /* Path where the new image should be saved. If it's not set the script will output the image without saving it */ $image->save_folder = 'thumbs/'; $process = $image->resize(); if($process['result'] && $image->save_folder) { echo 'The new image ('.$process['new_file_path'].') has been saved.'; } ?>