ФорумПрограммированиеPHP для идиотовРасширения PHP → Уменьшение качества веса размера картинки или фота средствами php пример как?

Уменьшение качества веса размера картинки или фота средствами php пример как?

  • fgfg

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 17 ноября 2012 г. 17:22, спустя 27 секунд

    Готовое решение

    В гугле найти пример сложнее чем написать самому
    Решил написать свой класс для обработки и уменьшения размера фотографий

    Возможности класса:
    - пропорционально уменьшать размер фото по ширине либо по высоте
    - уменьшить фото в процентном соотношении
    - вписать фотографию в рамку определенного размера
    - произвольное изменение размера фотографии
    - изменить качество фотографии
    - вывод сгенерированной фотографии без сохранения
    - сохранение фотографии на сервере
    - назначение фото прав доступа


    <?php
    class picture {

    private $image_file;

    public $image;
    public $image_type;
    public $image_width;
    public $image_height;


    public function __construct($image_file) {
    $this->image_file=$image_file;
    $image_info = getimagesize($this->image_file);
    $this->image_width = $image_info[0];
    $this->image_height = $image_info[1];
    switch($image_info[2]) {
    case 1: $this->image_type = &#39;gif&#39;; break;//1: IMAGETYPE_GIF
    case 2: $this->image_type = &#39;jpeg&#39;; break;//2: IMAGETYPE_JPEG
    case 3: $this->image_type = &#39;png&#39;; break;//3: IMAGETYPE_PNG
    case 4: $this->image_type = &#39;swf&#39;; break;//4: IMAGETYPE_SWF
    case 5: $this->image_type = &#39;psd&#39;; break;//5: IMAGETYPE_PSD
    case 6: $this->image_type = &#39;bmp&#39;; break;//6: IMAGETYPE_BMP
    case 7: $this->image_type = &#39;tiffi&#39;; break;//7: IMAGETYPE_TIFF_II (порядок байт intel)
    case 8: $this->image_type = &#39;tiffm&#39;; break;//8: IMAGETYPE_TIFF_MM (порядок байт motorola)
    case 9: $this->image_type = &#39;jpc&#39;; break;//9: IMAGETYPE_JPC
    case 10: $this->image_type = &#39;jp2&#39;; break;//10: IMAGETYPE_JP2
    case 11: $this->image_type = &#39;jpx&#39;; break;//11: IMAGETYPE_JPX
    case 12: $this->image_type = &#39;jb2&#39;; break;//12: IMAGETYPE_JB2
    case 13: $this->image_type = &#39;swc&#39;; break;//13: IMAGETYPE_SWC
    case 14: $this->image_type = &#39;iff&#39;; break;//14: IMAGETYPE_IFF
    case 15: $this->image_type = &#39;wbmp&#39;; break;//15: IMAGETYPE_WBMP
    case 16: $this->image_type = &#39;xbm&#39;; break;//16: IMAGETYPE_XBM
    case 17: $this->image_type = &#39;ico&#39;; break;//17: IMAGETYPE_ICO
    default: $this->image_type = &#39;&#39;; break;
    }
    $this->fotoimage();
    }

    private function fotoimage() {
    switch($this->image_type) {
    case &#39;gif&#39;: $this->image = imagecreatefromgif($this->image_file); break;
    case &#39;jpeg&#39;: $this->image = imagecreatefromjpeg($this->image_file); break;
    case &#39;png&#39;: $this->image = imagecreatefrompng($this->image_file); break;
    }
    }

    public function autoimageresize($new_w, $new_h) {
    $difference_w = 0;
    $difference_h = 0;
    if($this->image_width < $new_w &amp;&amp; $this->image_height < $new_h) {
    $this->imageresize($this->image_width, $this->image_height);
    }
    else {
    if($this->image_width > $new_w) {
    $difference_w = $this->image_width - $new_w;
    }
    if($this->image_height > $new_h) {
    $difference_h = $this->image_height - $new_h;
    }
    if($difference_w > $difference_h) {
    $this->imageresizewidth($new_w);
    }
    elseif($difference_w < $difference_h) {
    $this->imageresizeheight($new_h);
    }
    else {
    $this->imageresize($new_w, $new_h);
    }
    }
    }

    public function percentimagereduce($percent) {
    $new_w = $this->image_width * $percent / 100;
    $new_h = $this->image_height * $percent / 100;
    $this->imageresize($new_w, $new_h);
    }

    public function imageresizewidth($new_w) {
    $new_h = $this->image_height * ($new_w / $this->image_width);
    $this->imageresize($new_w, $new_h);
    }

    public function imageresizeheight($new_h) {
    $new_w = $this->image_width * ($new_h / $this->image_height);
    $this->imageresize($new_w, $new_h);
    }

    public function imageresize($new_w, $new_h) {
    $new_image = imagecreatetruecolor($new_w, $new_h);
    imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $new_w, $new_h, $this->image_width, $this->image_height);
    $this->image_width = $new_w;
    $this->image_height = $new_h;
    $this->image = $new_image;
    }

    public function imagesave($image_type=&#39;jpeg&#39;, $image_file=NULL, $image_compress=100, $image_permiss=&#39;&#39;) {
    if($image_file==NULL) {
    switch($this->image_type) {
    case &#39;gif&#39;: header(&quot;Content-type: image/gif&quot;); break;
    case &#39;jpeg&#39;: header(&quot;Content-type: image/jpeg&quot;); break;
    case &#39;png&#39;: header(&quot;Content-type: image/png&quot;); break;
    }
    }
    switch($this->image_type) {
    case &#39;gif&#39;: imagegif($this->image, $image_file); break;
    case &#39;jpeg&#39;: imagejpeg($this->image, $image_file, $image_compress); break;
    case &#39;png&#39;: imagepng($this->image, $image_file); break;
    }
    if($image_permiss != &#39;&#39;) {
    chmod($image_file, $image_permiss);
    }
    }

    public function imageout() {
    imagedestroy($this->image);
    }

    public function __destruct() {

    }

    }
    ?>


    Заюзывать довольно просто:


    пропорционально изменяем размер изображение и сохраняем на сервере не изменяя расширения файла
    полученное изображение не будет превышать по высоте 400 пикселей и по ширине 300
    т.е. автоматически впишется в нужные размеры

    $new_image = new picture(&#39;url или файл&#39;);
    $new_image->autoimageresize(300, 400);
    $new_image->imagesave($new_image->image_type, &#39;папка на сервере&#39;);
    $new_image->imageout();


    вывод на экран не изменяя расширения файла

    $new_image = new picture(&#39;url или файл&#39;);
    $new_image->autoimageresize(300, 400);
    $new_image->imagesave($new_image->image_type, NULL);
    $new_image->imageout();


    сохраняем на сервере и выбираем тип файла на выходе

    $new_image = new picture(&#39;url или файл&#39;);
    $new_image->autoimageresize(300, 400);
    $new_image->imagesave(&#39;png&#39;, &#39;папка на сервере&#39;);
    $new_image->imageout();


    ужимаем файл и выводим на экран

    $new_image = new picture(&#39;url или файл&#39;);
    $new_image->autoimageresize(300, 400);
    $new_image->imagesave(&#39;jpeg&#39;, NULL, 75);
    $new_image->imageout();


    сохраняем на сервере, ужимаем и устанавливаем права доступа

    $new_image = new picture(&#39;url или файл&#39;);
    $new_image->autoimageresize(300, 400);
    $new_image->imagesave(&#39;jpeg&#39;, &#39;папка на сервере&#39;, 75, 0777);
    $new_image->imageout();


    Уменьшаем изображение по ширине

    $new_image = new picture(&#39;url или файл&#39;);
    $new_image->imageresizewidth(300);
    $new_image->imagesave($new_image->image_type, &#39;папка на сервере&#39;);
    $new_image->imageout();


    Уменьшаем изображение по высоте

    $new_image = new picture(&#39;url или файл&#39;);
    $new_image->imageresizeheight(400);
    $new_image->imagesave($new_image->image_type, &#39;папка на сервере&#39;);
    $new_image->imageout();


    произвольно уменьшаем изображение не сохраняя пропорции

    $new_image = new picture(&#39;url или файл&#39;);
    $new_image->imageresize(300,400);
    $new_image->imagesave($new_image->image_type, &#39;папка на сервере&#39;);
    $new_image->imageout();


    уменьшаем изображение в процентном соотношении

    $new_image = new picture(&#39;url или файл&#39;);
    $new_image->percentimagereduce(30);
    $new_image->imagesave($new_image->image_type, &#39;папка на сервере&#39;);
    $new_image->imageout();


    Написано исключительно для сайта www.pyha.ru
  • phpdude

    Сообщения: 26618 Репутация: N Группа: в ухо

    Spritz 17 ноября 2012 г. 17:21, спустя 23 часа 59 минут 33 секунды

    ЕБАТЬТЫЛОХ {+++39+++} езе и спамер
    Сапожник без сапог
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 18 ноября 2012 г. 0:48, спустя 7 часов 27 минут

    case 1: $this->image_type = &#39;gif&#39;; break;//1: IMAGETYPE_GIF

    — а не проще так? —
    case IMAGETYPE_GIF: $this->image_type = &#39;gif&#39;; break;

  • Rotten

    Сообщения: ? Репутация: N Группа: Адекваты

    Spritz 27 декабря 2012 г. 5:13, спустя 39 дней 4 часа 25 минут

    ну да, зачем использовать магические числа….
  • aba90

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 6 января 2013 г. 13:01, спустя 10 дней 7 часов 47 минут

    до ху я готовых классов уже имеется. Уж что что, а для картинок говнокода хватает

Пожалуйста, авторизуйтесь, чтобы написать комментарий!