За последние 24 часа нас посетили 21077 программистов и 1626 роботов. Сейчас ищут 877 программистов ...

Изменение размеров PNG с сохранением прозрачности

Тема в разделе "Обработка изображений средствами PHP", создана пользователем nickolaza, 25 апр 2007.

  1. nickolaza

    nickolaza Активный пользователь

    С нами с:
    25 апр 2007
    Сообщения:
    3
    Симпатии:
    0
    Использую такой код для изменения размера картинки в формате 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-а, т.е. края рубленные, т.к. только один цвет делаю прозрачным.
    Подскажите пожалуйста как сделать "красиво", сохраня палитру прозрачности?
     
  2. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    К сожалению GD весьма нефункцциональна в этом плане. Смотрите в сторону imagemagic библиотеки
     
  3. nickolaza

    nickolaza Активный пользователь

    С нами с:
    25 апр 2007
    Сообщения:
    3
    Симпатии:
    0
    А комбинация imagesavealpha, ImageAlphaBlending не поможет?
     
  4. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Незнаю, не пробовал честно говоря. Но вообще, если вам _важно_ качество, лучше юзать что-то получше чем GD2. А так попробуйте, может поможет.
     
  5. nickolaza

    nickolaza Активный пользователь

    С нами с:
    25 апр 2007
    Сообщения:
    3
    Симпатии:
    0
    Спасибо за ответ!
    А imagemagic не тяжелее чем gd?
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    тяжелее но вроде для одноразового использования вроде как и лучше чем GD
    (хотя в этом вопросе уж больно хочется послушать того же 440Hz ;) )
     
  7. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    ImageMagic точно лучше, в ней и возможностей поболее, т.к. это внешняя библиотека, к которой нету модуля для PHP - придёться извращаться с системными вызовами через system.
     
  8. wifetrex

    wifetrex Активный пользователь

    С нами с:
    10 авг 2010
    Сообщения:
    1
    Симпатии:
    0
    Брал с двух разных источников, потом собрал все в кучу

    resize_class_transparent.php
    Код (Text):
    1. <?php
    2. class Resize_Image {
    3.  
    4.     var $image_to_resize;
    5.     var $new_width;
    6.     var $new_height;
    7.     var $ratio;
    8.     var $new_image_name;
    9.     var $save_folder;
    10.  
    11.     function setTransparency($new_image, $image_source)
    12.     {
    13.         $transparencyIndex = imagecolortransparent($image_source);
    14.         $transparencyColor = array('red' => 255, 'green' => 255, 'blue' => 255);
    15.        
    16.         if ($transparencyIndex >= 0)
    17.             $transparencyColor = imagecolorsforindex($image_source, $transparencyIndex);  
    18.        
    19.         $transparencyIndex = imagecolorallocate($new_image, $transparencyColor['red'], $transparencyColor['green'], $transparencyColor['blue']);
    20.         imagefill($new_image, 0, 0, $transparencyIndex);
    21.         imagecolortransparent($new_image, $transparencyIndex);
    22.     }
    23.    
    24.     function resize() {
    25.         if(!file_exists($this->image_to_resize)) {
    26.             exit("File ".$this->image_to_resize." does not exist.");
    27.         }
    28.  
    29.         $info = GetImageSize($this->image_to_resize);
    30.  
    31.         if(empty($info)) {
    32.             exit("The file ".$this->image_to_resize." doesn't seem to be an image.");
    33.         }
    34.  
    35.         $width = $info[0];
    36.         $height = $info[1];
    37.         $mime = $info['mime'];
    38.  
    39.         /* Keep Aspect Ratio? */
    40.  
    41.         if($this->ratio) {
    42.             // if preserving the ratio, only new width or new height
    43.             // is used in the computation. if both
    44.             // are set, use width
    45.  
    46.             if (isset($this->new_width)) {
    47.                 $factor = (float)$this->new_width / (float)$width;
    48.                 $this->new_height = $factor * $height;
    49.             } else if (isset($this->new_height)) {
    50.                 $factor = (float)$this->new_height / (float)$height;
    51.                 $this->new_width = $factor * $width;
    52.             } else exit("?neither new height or new width has been set");
    53.         }
    54.  
    55.         // What sort of image?
    56.  
    57.         $type = substr(strrchr($mime, '/'), 1);
    58.  
    59.         switch ($type) {
    60.             case 'jpeg':
    61.                 $image_create_func = 'ImageCreateFromJPEG';
    62.                 $image_save_func = 'ImageJPEG';
    63.           $new_image_ext = 'jpg';
    64.             break;
    65.  
    66.            case 'png':
    67.                 $image_create_func = 'ImageCreateFromPNG';
    68.                 $image_save_func = 'ImagePNG';
    69.                 $new_image_ext = 'png';
    70.             break;
    71.  
    72.             case 'bmp':
    73.                 $image_create_func = 'ImageCreateFromBMP';
    74.                 $image_save_func = 'ImageBMP';
    75.                 $new_image_ext = 'bmp';
    76.             break;
    77.  
    78.             case 'gif':
    79.                 $image_create_func = 'ImageCreateFromGIF';
    80.                 $image_save_func = 'ImageGIF';
    81.                 $new_image_ext = 'gif';
    82.             break;
    83.  
    84.             case 'vnd.wap.wbmp':
    85.                 $image_create_func = 'ImageCreateFromWBMP';
    86.                 $image_save_func = 'ImageWBMP';
    87.                  $new_image_ext = 'bmp';
    88.             break;
    89.  
    90.             case 'xbm':
    91.                 $image_create_func = 'ImageCreateFromXBM';
    92.                 $image_save_func = 'ImageXBM';
    93.                 $new_image_ext = 'xbm';
    94.             break;
    95.  
    96.             default:
    97.                 $image_create_func = 'ImageCreateFromJPEG';
    98.                 $image_save_func = 'ImageJPEG';
    99.                 $new_image_ext = 'jpg';
    100.         }
    101.  
    102.   // New Image
    103.  
    104.     if ($new_image_ext == 'png' ||  $new_image_ext == 'gif' )
    105.     {  
    106.         echo ("прозрачный!!!");
    107.         $image_c  = ImageCreateTrueColor($this->new_width, $this->new_height);
    108.         $new_image = $image_create_func($this->image_to_resize);
    109.         $this->setTransparency($image_c, $new_image);
    110.         ImageCopyResampled($image_c, $new_image , 0, 0, 0, 0, $this->new_width, $this->new_height, $width, $height);
    111.     }
    112.     else
    113.     {
    114.        
    115.         $image_c = ImageCreateTrueColor($this->new_width, $this->new_height);
    116.  
    117.         $new_image = $image_create_func($this->image_to_resize);
    118.  
    119.         ImageCopyResampled($image_c, $new_image, 0, 0, 0, 0, $this->new_width, $this->new_height, $width, $height);
    120.     }
    121.  
    122.  
    123.         if($this->save_folder) {
    124.          if($this->new_image_name) {
    125.                         $new_name = $this->new_image_name.'.'.$new_image_ext;
    126.          } else {
    127.                      $new_name = $this->new_thumb_name( basename($this->image_to_resize) ).'_resized.'.$new_image_ext;
    128.          }
    129.  
    130.     $save_path = $this->save_folder.$new_name;
    131.   } else {
    132.     /* Show the image without saving it to a folder */
    133.        header("Content-Type: ".$mime);
    134.              $image_save_func($image_c);
    135.        $save_path = '';
    136.   }
    137.  
    138.       $process = $image_save_func($image_c, $save_path);
    139.     return array('result' => $process, 'new_file_path' => $save_path);
    140.   }
    141.  
    142.   function new_thumb_name($filename) {
    143.     $string = trim($filename);
    144.     $string = strtolower($string);
    145.     $string = trim(ereg_replace("[^ A-Za-z0-9_]", " ", $string));
    146.     $string = ereg_replace("[ tnr]+", "_", $string);
    147.     $string = str_replace(" ", '_', $string);
    148.     $string = ereg_replace("[ _]+", "_", $string);
    149.  
    150.     return $string;
    151.   }
    152. }
    153.  
    154.  
    155. ?>
    index.php

    Код (Text):
    1. <?php
    2. include 'resize_class_transparent.php';
    3. $image = new Resize_Image;
    4.  
    5. $image->new_width = 200;
    6. $image->new_height = 200;
    7.  
    8. $image->image_to_resize = "temp.png"; // Full Path to the file
    9.  
    10. $image->ratio = true; // Keep Aspect Ratio?
    11.  
    12. // Name of the new image (optional) - If it's not set a new will be added automatically
    13.  
    14. $image->new_image_name =md5(date('U'));
    15.  
    16. /* Path where the new image should be saved. If it's not set the script will output the image without saving it */
    17.  
    18. $image->save_folder = 'thumbs/';
    19.  
    20. $process = $image->resize();
    21.  
    22. if($process['result'] && $image->save_folder) {
    23.   echo 'The new image ('.$process['new_file_path'].') has been saved.';
    24. }
    25. ?>
     
  9. manitor

    manitor Активный пользователь

    С нами с:
    25 дек 2010
    Сообщения:
    2
    Симпатии:
    0
  10. manitor

    manitor Активный пользователь

    С нами с:
    25 дек 2010
    Сообщения:
    2
    Симпатии:
    0