Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как уменьшить размер качество вес картинки на php 
:(
    Опции темы
fgfg
  Дата 18.11.2012, 01:12 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 18.11.2012

Репутация: нет
Всего: нет



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

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

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

Код

<?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 = 'gif'; break;//1: IMAGETYPE_GIF
            case 2: $this->image_type = 'jpeg'; break;//2: IMAGETYPE_JPEG
            case 3: $this->image_type = 'png'; break;//3: IMAGETYPE_PNG
            case 4: $this->image_type = 'swf'; break;//4: IMAGETYPE_SWF
            case 5: $this->image_type = 'psd'; break;//5: IMAGETYPE_PSD
            case 6: $this->image_type = 'bmp'; break;//6: IMAGETYPE_BMP
            case 7: $this->image_type = 'tiffi'; break;//7: IMAGETYPE_TIFF_II (порядок байт intel)
            case 8: $this->image_type = 'tiffm'; break;//8: IMAGETYPE_TIFF_MM (порядок байт motorola)
            case 9: $this->image_type = 'jpc'; break;//9: IMAGETYPE_JPC
            case 10: $this->image_type = 'jp2'; break;//10: IMAGETYPE_JP2
            case 11: $this->image_type = 'jpx'; break;//11: IMAGETYPE_JPX
            case 12: $this->image_type = 'jb2'; break;//12: IMAGETYPE_JB2
            case 13: $this->image_type = 'swc'; break;//13: IMAGETYPE_SWC
            case 14: $this->image_type = 'iff'; break;//14: IMAGETYPE_IFF
            case 15: $this->image_type = 'wbmp'; break;//15: IMAGETYPE_WBMP
            case 16: $this->image_type = 'xbm'; break;//16: IMAGETYPE_XBM
            case 17: $this->image_type = 'ico'; break;//17: IMAGETYPE_ICO
            default: $this->image_type = ''; break;
        }
        $this->fotoimage();
    }
    
    private function fotoimage() {
        switch($this->image_type) {
            case 'gif': $this->image = imagecreatefromgif($this->image_file); break;
            case 'jpeg': $this->image = imagecreatefromjpeg($this->image_file); break;
            case 'png': $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 && $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='jpeg', $image_file=NULL, $image_compress=100, $image_permiss='') {
        if($image_file==NULL) {
            switch($this->image_type) {
                case 'gif': header("Content-type: image/gif"); break;
                case 'jpeg': header("Content-type: image/jpeg"); break;
                case 'png': header("Content-type: image/png"); break;
            }
        }
        switch($this->image_type) {
            case 'gif': imagegif($this->image, $image_file); break;
            case 'jpeg': imagejpeg($this->image, $image_file, $image_compress); break;
            case 'png': imagepng($this->image, $image_file); break;
        }
        if($image_permiss != '') {
            chmod($image_file, $image_permiss);
        }
    }
    
    public function imageout() {
        imagedestroy($this->image);
    }
    
    public function __destruct() {
        
    }
    
}
?>


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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


Написано исключительно для сайта http://nagon.net/knigi.php


Это сообщение отредактировал(а) fgfg - 18.11.2012, 01:14
PM MAIL WWW   Вверх
Addmin
Дата 14.1.2013, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 3.2.2006
Где: сослан в Сибирь

Репутация: нет
Всего: 15



О! Клёвый велосипед! Пойду кататься!


--------------------
PM MAIL   Вверх
xoptov
  Дата 25.1.2013, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 16.2.2008

Репутация: нет
Всего: нет



Это ООП? Почему нет базового класса и производных?
Конструктор видимо для того чтобы хранить несколько созданных объектов с загруженными картинками, нагрузки не многовато?
Почему не реализовать просто статичный класс?
Почему в некоторых функциях больше 2-х параметров, где чистота кода?
Почему в функциях больше 1-го оператора ветвления?
Где наглядные имена функций, например camelCase?
Где обработка ошибок? или ошибок скажем при попытки получить информацию о изображении из файла не бывает?
Где генерация отлов исключений при ошибках - ваш скрипт молчун?
Где пропорциональное уменьшение размера изображение только по одной известной стороне?
Неужели в autoimageresize нельзя было обойтись без такого адского ветвления?
Почему диструктор пустой?

Вывод: Я бы не стал пользоваться вашим кодом, а предпочел бы написать свой велосипед, по той причине что из моего велосипеда я старался бы сделать немного по другому.  Хотите писать адский код, делайте это на языке более низкого уровня и компилируйте с максимальным сжатием - чтобы люди не пытались читать то что вы написали...

К автору ничего личного.
PM MAIL   Вверх
bars80080
Дата 25.1.2013, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 2
Всего: 315



Цитата(xoptov @  25.1.2013,  10:53 Найти цитируемый пост)
Почему в некоторых функциях больше 2-х параметров, где чистота кода?

а больше нельзя?

Цитата(xoptov @  25.1.2013,  10:53 Найти цитируемый пост)
Почему в функциях больше 1-го оператора ветвления?

а что такого?

чисто ради интереса, какая религия налагает такие ограничения?
PM MAIL WWW   Вверх
xoptov
Дата 26.1.2013, 09:23 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 16.2.2008

Репутация: нет
Всего: нет



Цитата(bars80080 @ 25.1.2013,  12:49)
Цитата(xoptov @  25.1.2013,  10:53 Найти цитируемый пост)
Почему в некоторых функциях больше 2-х параметров, где чистота кода?

а больше нельзя?

Цитата(xoptov @  25.1.2013,  10:53 Найти цитируемый пост)
Почему в функциях больше 1-го оператора ветвления?

а что такого?

чисто ради интереса, какая религия налагает такие ограничения?

Это брат не религия, можно конечно и не соблюдать такие правила и все будет работать.
Ну а если интересно можете прочитать книгу Роберта Мартина "Чистый код" где он неплохо излагает почему нужен чистый код и как его производить.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Графика | Следующая тема »


 




[ Время генерации скрипта: 0.1402 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.