За последние 24 часа нас посетили 15612 программистов и 1549 роботов. Сейчас ищут 869 программистов ...

Сжать загружаемую фотку

Тема в разделе "PHP для новичков", создана пользователем allowance, 25 май 2010.

  1. allowance

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

    С нами с:
    19 янв 2010
    Сообщения:
    196
    Симпатии:
    0
    Знаю что можно уменьшить размер в пикселях при загрузки фото.
    А можно ли ещё сжимать фотку при аплоаде до оптимального качества, т.е если взять фотку и сохранить её в фотошопе методом Save for web $ devices то по качеству будет незаметно а по размеру ощутимо в разы.
     
  2. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Ваша правда, можно
     
  3. allowance

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

    С нами с:
    19 янв 2010
    Сообщения:
    196
    Симпатии:
    0
    ShamahN
    Правда? И как же?
     
  4. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Все так просто как Вы хотите не будет) но вот, откопал класс.. в детстве писал (вроде бы флопик(c) изначально, но уверять не буду). Он должен делать тхумбы из картинок.. поковыряйся - принцип поймешь.
    Только сразу предупреждаю, делался он мной 100 лет назад. не смеяться =)
    PHP:
    1. <?php
    2. class image
    3. {
    4.     static private $thumb_width = 96;
    5.     static private $thumb_height = 96;
    6.     static private $thumb_folder = "/images/thumb/";
    7.     static private $thumb_prefix = "small_";
    8.     public $id;
    9.     public $path;
    10.     public $title;
    11.     public $width;
    12.     public $height;
    13.     public $thumb;
    14.     function __construct($id, $path, $title, $parrs, $need_thumb = 0) {
    15.         $parr = json_decode($parrs);
    16.        
    17.         $this->id     = $id;
    18.         $this->path   = $path;
    19.         $this->title  = $title;
    20.         $this->type   = "image";
    21.         $this->width  = $parr->width;
    22.         $this->height = $parr->height;
    23.         $this->thumb  = $need_thumb?(self::cropResizeImage($this->path)):"";
    24.     }
    25.    
    26.     public static function cropResizeImage($src, $width=false, $height=false, $dest=false, $rgb=0xFFFFFF, $quality=100)
    27.     {
    28.         if (!$dest) $dest = self::$thumb_folder.self::$thumb_prefix.basename($src);
    29.        
    30.         if (file_exists($_SERVER["DOCUMENT_ROOT"].$dest)) return $dest;
    31.         if (!file_exists($_SERVER["DOCUMENT_ROOT"].$src)) return false;
    32.  
    33.         if (!$width) $width   = self::$thumb_width;
    34.         if (!$height) $height = self::$thumb_height;
    35.        
    36.         $size = getimagesize($_SERVER["DOCUMENT_ROOT"].$src);
    37.        
    38.         if ($size === false) return false;
    39.        
    40.         // Определяем исходный формат по MIME-информации, предоставленной
    41.         // функцией getimagesize, и выбираем соответствующую формату
    42.         // imagecreatefrom-функцию.
    43.         $format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
    44.         $icfunc = "imagecreatefrom" . $format;
    45.        
    46.         if (!function_exists($icfunc)) return false;
    47.        
    48.         $image = $icfunc($_SERVER["DOCUMENT_ROOT"].$src);
    49.         $image_width = imagesx($image);
    50.         $image_height = imagesy($image);
    51.        
    52.         $proporshn = $image_width / $image_height;
    53.        
    54.         if ($image_width > $image_height) {
    55.             $thumb_width = $width;
    56.             $thumb_height = $image_height * ($width / $image_width);
    57.         } else{
    58.             $thumb_width = $image_width * ($height / $image_height);
    59.             $thumb_height = $height;
    60.         }
    61.  
    62.         $thumb_image = imagecreatetruecolor($thumb_width, $thumb_height);
    63.         imagecopyresampled($thumb_image, $image, 0, 0, 0, 0, $thumb_width, $thumb_height, $image_width, $image_height);
    64.        
    65.         $crop_image = imagecreatetruecolor($width, $height);
    66.         imagecopy($crop_image, $thumb_image, 0, 0, intval(($thumb_width - $width) / 2), intval(($thumb_height - $height) / 2), $width, $height);
    67.        
    68.         imagejpeg($thumb_image, $_SERVER["DOCUMENT_ROOT"].$dest, $quality);
    69.  
    70.         imagedestroy($crop_image);
    71.         imagedestroy($thumb_image);
    72.        
    73.         return $dest;      
    74.     }
    75. }
    76.  
    77. ?>
     
  5. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    GD вам не фотошоп.
     
  6. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Apple, я думал человеку аналогия нужна плане ухудшить качество
     
  7. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Готовой аналогии в GD нет.
    Фотошоп для этого использует математические рассчеты и индивидуальный подход к каждому изображению с возможностью указать используемую палитру.
    В GD просто функцией ресайза и imagepng/jpeg аналогичной работы не добиться.
    Можно максимально приблизить, но при этом самостоятельно просчитывать, блюрить, обрабатывать симилиарные сегменты.

    По мне так речь идет о imagejpeg и никаких мудреных алгоритмах.
    Если нет, то готового можно не искать.