Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Класс уменьшения размера изображения

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
lowmax
Отправлено: 17 Ноября, 2012 - 22:50:09
Post Id



Новичок


Покинул форум
Сообщений всего: 39
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




Готовый класс на PHP
Для тех кто ищет в гугле

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

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


PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class picture {
  3.        
  4.         private $image_file;
  5.        
  6.         public $image;
  7.         public $image_type;
  8.         public $image_width;
  9.         public $image_height;
  10.        
  11.        
  12.         public function __construct($image_file) {
  13.                 $this->image_file=$image_file;
  14.                 $image_info = getimagesize($this->image_file);
  15.                 $this->image_width = $image_info[0];
  16.                 $this->image_height = $image_info[1];
  17.                 switch($image_info[2]) {
  18.                         case 1: $this->image_type = 'gif'; break;//1: IMAGETYPE_GIF
  19.                         case 2: $this->image_type = 'jpeg'; break;//2: IMAGETYPE_JPEG
  20.                         case 3: $this->image_type = 'png'; break;//3: IMAGETYPE_PNG
  21.                         case 4: $this->image_type = 'swf'; break;//4: IMAGETYPE_SWF
  22.                         case 5: $this->image_type = 'psd'; break;//5: IMAGETYPE_PSD
  23.                         case 6: $this->image_type = 'bmp'; break;//6: IMAGETYPE_BMP
  24.                         case 7: $this->image_type = 'tiffi'; break;//7: IMAGETYPE_TIFF_II (порядок байт intel)
  25.                         case 8: $this->image_type = 'tiffm'; break;//8: IMAGETYPE_TIFF_MM (порядок байт motorola)
  26.                         case 9: $this->image_type = 'jpc'; break;//9: IMAGETYPE_JPC
  27.                         case 10: $this->image_type = 'jp2'; break;//10: IMAGETYPE_JP2
  28.                         case 11: $this->image_type = 'jpx'; break;//11: IMAGETYPE_JPX
  29.                         case 12: $this->image_type = 'jb2'; break;//12: IMAGETYPE_JB2
  30.                         case 13: $this->image_type = 'swc'; break;//13: IMAGETYPE_SWC
  31.                         case 14: $this->image_type = 'iff'; break;//14: IMAGETYPE_IFF
  32.                         case 15: $this->image_type = 'wbmp'; break;//15: IMAGETYPE_WBMP
  33.                         case 16: $this->image_type = 'xbm'; break;//16: IMAGETYPE_XBM
  34.                         case 17: $this->image_type = 'ico'; break;//17: IMAGETYPE_ICO
  35.                         default: $this->image_type = ''; break;
  36.                 }
  37.                 $this->fotoimage();
  38.         }
  39.        
  40.         private function fotoimage() {
  41.                 switch($this->image_type) {
  42.                         case 'gif': $this->image = imagecreatefromgif($this->image_file); break;
  43.                         case 'jpeg': $this->image = imagecreatefromjpeg($this->image_file); break;
  44.                         case 'png': $this->image = imagecreatefrompng($this->image_file); break;
  45.                 }
  46.         }
  47.        
  48.         public function autoimageresize($new_w, $new_h) {
  49.                 $difference_w = 0;
  50.                 $difference_h = 0;
  51.                 if($this->image_width < $new_w && $this->image_height < $new_h) {
  52.                         $this->imageresize($this->image_width, $this->image_height);
  53.                 }
  54.                 else {
  55.                         if($this->image_width > $new_w) {
  56.                                 $difference_w = $this->image_width - $new_w;
  57.                         }
  58.                         if($this->image_height > $new_h) {
  59.                                 $difference_h = $this->image_height - $new_h;
  60.                         }
  61.                                 if($difference_w > $difference_h) {
  62.                                         $this->imageresizewidth($new_w);
  63.                                 }
  64.                                 elseif($difference_w < $difference_h) {
  65.                                         $this->imageresizeheight($new_h);
  66.                                 }
  67.                                 else {
  68.                                         $this->imageresize($new_w, $new_h);
  69.                                 }
  70.                 }
  71.         }
  72.        
  73.         public function percentimagereduce($percent) {
  74.                 $new_w = $this->image_width * $percent / 100;
  75.                 $new_h = $this->image_height * $percent / 100;
  76.                 $this->imageresize($new_w, $new_h);
  77.         }
  78.        
  79.         public function imageresizewidth($new_w) {
  80.                 $new_h = $this->image_height * ($new_w / $this->image_width);
  81.                 $this->imageresize($new_w, $new_h);
  82.         }
  83.        
  84.         public function imageresizeheight($new_h) {
  85.                 $new_w = $this->image_width * ($new_h / $this->image_height);
  86.                 $this->imageresize($new_w, $new_h);
  87.         }
  88.        
  89.         public function imageresize($new_w, $new_h) {
  90.                 $new_image = imagecreatetruecolor($new_w, $new_h);
  91.                 imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $new_w, $new_h, $this->image_width, $this->image_height);
  92.                 $this->image_width = $new_w;
  93.                 $this->image_height = $new_h;
  94.                 $this->image = $new_image;
  95.         }
  96.        
  97.         public function imagesave($image_type='jpeg', $image_file=NULL, $image_compress=100, $image_permiss='') {
  98.                 if($image_file==NULL) {
  99.                         switch($this->image_type) {
  100.                                 case 'gif': header("Content-type: image/gif"); break;
  101.                                 case 'jpeg': header("Content-type: image/jpeg"); break;
  102.                                 case 'png': header("Content-type: image/png"); break;
  103.                         }
  104.                 }
  105.                 switch($this->image_type) {
  106.                         case 'gif': imagegif($this->image, $image_file); break;
  107.                         case 'jpeg': imagejpeg($this->image, $image_file, $image_compress); break;
  108.                         case 'png': imagepng($this->image, $image_file); break;
  109.                 }
  110.                 if($image_permiss != '') {
  111.                         chmod($image_file, $image_permiss);
  112.                 }
  113.         }
  114.        
  115.         public function imageout() {
  116.                 imagedestroy($this->image);
  117.         }
  118.        
  119.         public function __destruct() {
  120.                
  121.         }
  122.        
  123. }
  124. ?>
  125.  


заюзывать очень просто:

пропорционально изменяем размер изображение и сохраняем на сервере не изменяя расширения файла
полученное изображение не будет превышать по высоте 400 пикселей и по ширине 300
т.е. автоматически впишется в нужные размеры
PHP:
скопировать код в буфер обмена
  1.  
  2. $new_image = new picture('url или файл');
  3. $new_image->autoimageresize(300, 400);
  4. $new_image->imagesave($new_image->image_type, 'папка на сервере');
  5. $new_image->imageout();
  6.  


вывод на экран не изменяя расширения файла
PHP:
скопировать код в буфер обмена
  1.  
  2. $new_image = new picture('url или файл');
  3. $new_image->autoimageresize(300, 400);
  4. $new_image->imagesave($new_image->image_type, NULL);
  5. $new_image->imageout();
  6.  


сохраняем на сервере и выбираем тип файла на выходе
PHP:
скопировать код в буфер обмена
  1.  
  2. $new_image = new picture('url или файл');
  3. $new_image->autoimageresize(300, 400);
  4. $new_image->imagesave('png', 'папка на сервере');
  5. $new_image->imageout();
  6.  


ужимаем файл и выводим на экран
PHP:
скопировать код в буфер обмена
  1.  
  2. $new_image = new picture('url или файл');
  3. $new_image->autoimageresize(300, 400);
  4. $new_image->imagesave('jpeg', NULL, 75);
  5. $new_image->imageout();
  6.  


сохраняем на сервере, ужимаем и устанавливаем права доступа
PHP:
скопировать код в буфер обмена
  1.  
  2. $new_image = new picture('url или файл');
  3. $new_image->autoimageresize(300, 400);
  4. $new_image->imagesave('jpeg', 'папка на сервере', 75, 0777);
  5. $new_image->imageout();
  6.  


Уменьшаем изображение по ширине
PHP:
скопировать код в буфер обмена
  1.  
  2. $new_image = new picture('url или файл');
  3. $new_image->imageresizewidth(300);
  4. $new_image->imagesave($new_image->image_type, 'папка на сервере');
  5. $new_image->imageout();
  6.  


Уменьшаем изображение по высоте
PHP:
скопировать код в буфер обмена
  1.  
  2. $new_image = new picture('url или файл');
  3. $new_image->imageresizeheight(400);
  4. $new_image->imagesave($new_image->image_type, 'папка на сервере');
  5. $new_image->imageout();
  6.  


произвольно уменьшаем изображение не сохраняя пропорции
PHP:
скопировать код в буфер обмена
  1.  
  2. $new_image = new picture('url или файл');
  3. $new_image->imageresize(300,400);
  4. $new_image->imagesave($new_image->image_type, 'папка на сервере');
  5. $new_image->imageout();
  6.  


уменьшаем изображение в процентном соотношении
PHP:
скопировать код в буфер обмена
  1.  
  2. $new_image = new picture('url или файл');
  3. $new_image->percentimagereduce(30);
  4. $new_image->imagesave($new_image->image_type, 'папка на сервере');
  5. $new_image->imageout();
  6.  



P.S.
Протестировано на http://nagon[dot]net/knigi.php

(Отредактировано автором: 17 Ноября, 2012 - 23:24:20)

 
 Top
LIME
Отправлено: 18 Ноября, 2012 - 05:08:00
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




глянул бегло
индусы атакуют
 
 Top
Мелкий Супермодератор
Отправлено: 18 Ноября, 2012 - 08:30:38
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




lowmax пишет:
case 1: $this->image_type = 'gif'; break;//1: IMAGETYPE_GIF

PHP:
скопировать код в буфер обмена
  1. case IMAGETYPE_GIF: $this->image_type = 'gif'; break;

Или вообще по матрице:
PHP:
скопировать код в буфер обмена
  1. $rgAllowedTypes = array(
  2. IMAGETYPE_GIF=>'gif',
  3. IMAGETYPE_JPEG=>'jpeg',
  4. //...
  5. );
  6. $this->image_type = isset($rgAllowedTypes[ $image_info[2] ]) ? $rgAllowedTypes[ $image_info[2] ] : '';


Почему никак не предупреждаете о не поддерживаемом типе изображений? Зачем в конструкторе описаны все, а может работать только с тремя?
И почему не используется деструктор?


-----
PostgreSQL DBA
 
 Top
DlTA
Отправлено: 19 Ноября, 2012 - 10:09:12
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




lowmax пишет:
$new_image->imagesave('jpeg', NULL, 75);
плохой вариант кода, получается что я должен помнить что именно вводить в тим сохраняемого изображения,

корректней было бы использовать те же константы IMAGETYPE_JPEG

$new_image->imagesave(IMAGETYPE_JPEG, NULL, 75);

хотя имхо, лучше было бы вообще этот метод сделать приватным, а доступ к нему сделать через несколько публичных, например:
$new_image->imageSave('filename', type=default); // сохранение в файл и только
$new_image->imageOut(type=default); // выдача в браузер и только

можно еще изловчиться, создать класс изображение, а уже от него наследовать классы для работы с каждым конкретным типом.
 
 Top
avtor.fox
Отправлено: 19 Ноября, 2012 - 10:25:54
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


Помог: 50 раз(а)




lowmax сколько раз и какое количество экземпляров класса я создам если -
Нужно пережать не одну картинку за 1 запуск скрипта;
При обработке изображений например понадобилось не только принудительно изменить их размер явно в пикселях, но и изменить процентное соотношение. Пример - одну картинку изменяем явно (пиксели), другую в процентах. 100 итераций цикла на обработку. Нужен костыль;
- непонятно.
Вывод обработанного изображения?
Улыбка
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Графика в PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB