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 :: Класс для работы с изображениями class cms_img

 PHP.SU

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


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

> Описание: PHP, GD
ALEN Модератор
Отправлено: 05 Марта, 2011 - 11:34:38
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


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




Сам себе в ответ на то, что уже писал ранее (http://forum.php.su/topic.php?fo...35&topic=732 ) , создал новый функциональный класс.

Функции класса:
— Создание нового изображения с указанными размерами и цветом. или просто загружаем существующее (можно через URL-CURL ).
— Наложение логотипа в любой угол изображения
— Изменение изображения, если установить ширину и высоту равной, то деформация незаметна
— Наложение текста, тут полная функциональность, можно выбрать: координаты, прозрачность надписи, угол надписи, цвет надписи
— сохранение и вывод изображения (можно 2 в 1, а можно сохранять на разных этапах создания).

P.S. Данный класс сделан конкретно для использования GD, ImageMagick — это отдельная тема, поэтому пока прошу ее опустить.

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class cms_img {
  4.  
  5. protected $srcImage=false;  //  дескриптор созданного изображения
  6. protected $coordinate=4; // 1-верхний, левый, 2-правый, верхний, 3-нижний, правый...
  7. protected $coord=array();
  8. protected $namefile='000.png';
  9. protected $tmp='000.png';
  10. protected $image_type=3;
  11.  
  12. // Передаем дефолтное название картинки, если оно в дальнейшем не будет указано и тип создаваемого изображения
  13. function __construct($tmp='000.png',$image_type=3,$namefile='000.png') {
  14.         $this->image_type=$image_type;
  15.         $this->namefile=$namefile;
  16.         $this->tmp=$tmp;
  17. }
  18.  
  19.  
  20. // Произвести принудительную замену типа изображения? доступные значение:
  21. // 1=GIF ; 2=JPEG; 3=PNG
  22. protected function set_type($type) {
  23.         $type=strtr($type,array("gif"=>1,"jpeg"=>2,"jpg"=>2,"png"=>3,"GIF"=>1,"JPEG"=>2,"JPG"=>2,"PNG"=>3));
  24.         if($type==1||$type==2||$type==3){
  25.                 $this->image_type=$type;
  26.         }
  27. }
  28.  
  29.  
  30. // Метод для получения dst_x и dst_y  функции  imagecopy
  31. protected function coordinat($srcWidth, $srcHeight, $logoWidth, $logoHeight){
  32.         if($this->coordinate==1){
  33.                 $this->coord['dst_x']=0;
  34.                 $this->coord['dst_y']=0;
  35.         } elseif($this->coordinate==2){
  36.                 $this->coord['dst_x']=$srcWidth - $logoWidth;
  37.                 $this->coord['dst_y']=0;
  38.         } elseif($this->coordinate==3){
  39.                 $this->coord['dst_x']=$srcWidth - $logoWidth;
  40.                 $this->coord['dst_y']=$srcHeight - $logoHeight;
  41.         } elseif($this->coordinate==5){
  42.                 $this->coord['dst_x']=$srcWidth/2 - $logoWidth/2;
  43.                 $this->coord['dst_y']=$srcHeight/2 - $logoHeight/2;
  44.         } else {
  45.                 $this->coord['dst_x']=0;
  46.                 $this->coord['dst_y']=$srcHeight - $logoHeight;
  47.         }
  48. }
  49.  
  50. // создаёт новое изображение из файла
  51. // $filename адрес исхизображения
  52. protected function imagecreatefrom($filename) {
  53.     $image_info = getimagesize($filename);
  54.     $this->image_type=$image_info[2];
  55.     if($this->image_type==2 ) {
  56.         return imagecreatefromjpeg($filename);
  57.     } elseif($this->image_type==1 ) {
  58.         return imagecreatefromgif($filename);
  59.     } elseif($this->image_type==3 ) {
  60.         return imagecreatefrompng($filename);
  61.     } else {
  62.       return false;
  63.     }
  64. }
  65.  
  66. // загрузка изображения из файла  аргумент
  67. // $img от куда читаем
  68. public function load($img){
  69.         $this->namefile=$img;
  70.         if($this->imagecreatefrom($this->namefile)!=false){
  71.         $this->srcImage = $this->imagecreatefrom($this->namefile);
  72.     } else {
  73.         return false;
  74.     }
  75. }
  76.  
  77. // Вывод изображения на экран
  78. public function output(){
  79.     if($this->image_type==2){
  80.         header("Content-Type: image/jpg");
  81.         ImageJPEG($this->srcImage);
  82.     } elseif($this->image_type==1){
  83.         header("Content-Type: image/gif");
  84.         ImageGIF($this->srcImage);
  85.     } else {
  86.         header("Content-Type: image/png");
  87.         ImagePNG($this->srcImage);
  88.     }
  89. }
  90.  
  91.  
  92. // Получаем расширение файла, метод необходим для автоматическом добавлении расширения файла используемом в методе save()
  93. public function extension(){
  94.     if($this->image_type==2){
  95.         return "jpg";
  96.     } elseif($this->image_type==1){
  97.         return "gif";
  98.     } else {
  99.         return "png";
  100.     }
  101. }
  102.  
  103. // Сохранение изображения в файл  аргумент $namefile - куда сохранять
  104. public function save($namefile=false,$type=false){
  105.         $this_namefile=$namefile?$namefile:$this->namefile;
  106.         $type==1?$this_namefile.'.'.$this->extension():$this_namefile;
  107.     if($this->image_type==2) {
  108.         ImageJPEG($this->srcImage, $this_namefile, 100);
  109.     } elseif($this->image_type==1 ) {
  110.         ImageGIF($this->srcImage, $this_namefile);
  111.     } else {
  112.         ImagePNG($this->srcImage, $this_namefile);
  113.     }
  114. }
  115.  
  116. // Получение ширины и высоты текущего изображения
  117. public function sxy(){
  118.     $this->srcWidth  = ImageSX($this->srcImage);
  119.     $this->srcHeight = ImageSY($this->srcImage);
  120.     return  array("w"=>$this->srcWidth,"h"=>$this->srcHeight);
  121. }
  122.  
  123. // Установка логотипа на изображение
  124. // $logosrc - адрес логотипа, $coordinate = угол изображения:
  125. // 1-верхний, левый, 2-правый, верхний, 3-нижний, правый...
  126. public function setlogo($logosrc,$coordinate=false)
  127. {
  128.         $this->coordinate=$coordinate!=false&&filter_var($coordinate,FILTER_VALIDATE_INT)?$coordinate:$this->coordinate;
  129.     $logoImage = $this->imagecreatefrom($logosrc);
  130.  
  131.     $srcWidth  = ImageSX($this->srcImage);
  132.     $srcHeight = ImageSY($this->srcImage);
  133.  
  134.     $logoWidth  = ImageSX($logoImage);
  135.     $logoHeight = ImageSY($logoImage);
  136.  
  137.     imageAlphaBlending($logoImage, false);
  138.     imageSaveAlpha($logoImage, true);
  139.  
  140.     $trcolor = ImageColorAllocate($logoImage, 255, 255, 255);
  141.     ImageColorTransparent($logoImage , $trcolor);
  142.  
  143.     $this->coordinat($srcWidth, $srcHeight, $logoWidth, $logoHeight);
  144.     imagecopy($this->srcImage, $logoImage, $this->coord['dst_x'], $this->coord['dst_y'],0,0, $logoWidth, $logoHeight);
  145.  
  146.     unset($logoImage);
  147. }
  148.  
  149. // Изменение размера изображения
  150. // $width - ширина,  $height высота,
  151. // если не указать $height , то аргумент $width будет считать процентным соотношением во сколько процентов изменять масштаб
  152. public function resize($width,$height=false){
  153.  
  154.         // Проверяем корректность введения ширины и высоты
  155.         $width=filter_var($width,FILTER_VALIDATE_INT)?$width:false;
  156.         $height=filter_var($height,FILTER_VALIDATE_INT)?$height:false;
  157.  
  158.         // Если ширина не указана или указана некорректно, то будет игнорироватся изменение масштаба изображения
  159.         if(($width!='100'&&$height==false) or ($width!=false&&$height!=false)){
  160.         $w_src = ImageSX($this->srcImage);
  161.         $h_src = ImageSY($this->srcImage);
  162.  
  163.         // Если не указана высота, то по процентному соотношению вычисляем новый масштаб
  164.         if($height==false){
  165.                 $height=($h_src/100)*$width;
  166.                 $width=($w_src/100)*$width;
  167.         }
  168.  
  169.         $dest = imagecreatetruecolor($width,$height);
  170.  
  171.         if($height==$width){
  172.                 if ($w_src>$h_src) {
  173.                         imagecopyresized($dest, $this->srcImage, 0, 0, round((max($w_src,$h_src)-min($w_src,$h_src))/2), 0, $width, $height, min($w_src,$h_src), min($w_src,$h_src));
  174.                 } else {
  175.                         imagecopyresized($dest, $this->srcImage, 0, 0, 0, round((max($w_src,$h_src)-min($w_src,$h_src))/2), $width, $height, min($w_src,$h_src), min($w_src,$h_src));
  176.         }
  177.     } else {
  178.         imagecopyresized($dest, $this->srcImage, 0, 0, 0, 0, $width, $height, $w_src, $h_src);
  179.         }
  180.  
  181.         $this->srcImage=$dest;
  182.         unset($dest);
  183.  
  184.         }
  185. }
  186.  
  187. // освобождает память, ассоциированную с изображением
  188. public function destroy(){
  189.         ImageDestroy($this->srcImage);
  190. }
  191.  
  192. // Наложение текста на изображение
  193. // $text - текст, $fontfile - путь к файлу со шрифтами, $color цвет в виде #000000, по умолчанию #000000
  194. // $size - размер шрифта , $angle - угол в градусах , $x - координата x - от куда печатать, $y - координата y, от куда печатать,
  195. // $pr - прозрачность от 0-непрозрачно до 127 - обсалютно прозрачно
  196. public function text($text,$fontfile,$color='#000000',$size=20,$angle=0,$x=10,$y=10,$pr=0){
  197.     $col=$this->htmltorgb($color);
  198.     $color = imagecolorallocatealpha($this->srcImage, $col[0],$col[1], $col[2],$pr);
  199.         imagettftext ($this->srcImage,$size,$angle,$x,$y,$color,$fontfile,$text);
  200. }
  201.  
  202. // Метод для получения цвета из html в rgb
  203. // $color - цвет в html
  204. protected function htmltorgb($color)
  205. {
  206.     if ($color[0] == '#'){
  207.         $color = substr($color, 1);
  208.     }
  209.     if (strlen($color)==6){
  210.         list($r,$g,$b)=array($color[0].$color[1], $color[2].$color[3], $color[4].$color[5]);
  211.     } elseif (strlen($color) == 3){
  212.         list($r, $g, $b) = array($color[0].$color[0], $color[1].$color[1], $color[2].$color[2]);
  213.     } else {
  214.         return false;
  215.         }
  216.     $r = hexdec($r); $g = hexdec($g); $b = hexdec($b);
  217.     return array($r, $g, $b);
  218. }
  219.  
  220. // Создает новое изображение шириной $width и высотой $height
  221. // цветом $color (в html виде , по умолчанию #ffffff)
  222. // Если нужна прозрачность то 4 аргумент $pr указывать $pr=1
  223. public function create($width,$height,$color='#ffffff',$pr=false) {
  224.         $width=filter_var($width,FILTER_VALIDATE_INT)?$width:200;
  225.         $height=filter_var($height,FILTER_VALIDATE_INT)?$height:200;
  226.     $col=$this->htmltorgb($color);
  227.     $this->srcImage = imagecreatetruecolor($width,$height);
  228.     $color = imagecolorallocate($this->srcImage, $col[0],$col[1], $col[2]);
  229.     imagefilledrectangle($this->srcImage, 0, 0, ($width-1), ($height-1), $color);
  230.     if($pr==1){
  231.         imagetruecolortopalette($this->srcImage, true, 1);
  232.         imagecolortransparent($this->srcImage,$color);
  233.     }
  234. }
  235.  
  236. // Возвращает идентификатор изображения для работы с ним вне класса
  237. public function return_img(){
  238.         return $this->srcImage;
  239. }
  240.  
  241. // Передаем идентификатор изображения для работы с ним внутри класса
  242. // $img - идентификатор загружаемого изображения
  243. public function set_img($img){
  244.     $this->srcImage=$img;
  245. }
  246.  
  247. // освобождает память, ассоциированную с изображением
  248. function __destruct() {
  249.         ImageDestroy($this->srcImage);
  250. }
  251.  
  252. // метод получения изображения по URL
  253. // $url - урл изображения, $tmp - временное место хранения
  254. public function load_url($url,$tmp){
  255.         if(filter_var($url,FILTER_VALIDATE_URL)){
  256.         $ch = curl_init($url);
  257.                 $fp = fopen($tmp, "w");
  258.                 curl_setopt ($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1');
  259.                 curl_setopt($ch, CURLOPT_HEADER, 0);
  260.                 curl_setopt($ch, CURLOPT_FILE, $fp);
  261.                 curl_exec($ch);
  262.                 curl_close($ch);
  263.                 fclose($fp);
  264.                 if(file_exists($tmp)&&$this->load($tmp)==false){
  265.                         unlink($tmp);
  266.                         return false;
  267.                 } else {
  268.                         unlink($tmp);
  269.                         return true;
  270.                 }
  271.         } else {
  272.                 return false;
  273.         }
  274. }
  275.  
  276. }


Использование:

PHP:
скопировать код в буфер обмена
  1. $img=new cms_img;
  2. # Создает изображение с шириной и высотой и цветом, если false заменить на 1 то изображение будет прозрачным
  3. $img->create(350,350,"#000000",false);
  4. # Загружаем существующее изображение
  5. $img->load("img.jpg");
  6. # загружает картинку через CURL ,
  7. # $url - адрес изображения, $tmp - временный файл изображения (не папка)
  8. # файл не сохраняется, а только загружается в класс, для сохранения используйте метод save()
  9. $img->load_url($url,$tmp)
  10. # Установка логотипа, возможны варианты в 4 угла.
  11. # углы пронумерованы по часовой стрелке , начало с верхнего левого угла, 5 = посередине
  12. $img->setlogo("logo.png",1);
  13. # Изменяет изображение на 90%
  14. $img->resize(90);
  15. # Изменяет изображение до указаной ширины высоты
  16. $img->resize(500,400);
  17. # Сохраняет изображение по указанному адресу
  18. # второй аргумент если установить =1, то к названию файла будет автоматически прикрепляться расширение файла
  19. $img->save("2.jpg",false);
  20. # возвращает идентификатор изображения
  21. # это на случай, если на каком то этапе с изображением, кто-то решит своими руками внести чего
  22. $img->return_img();
  23. # Передать индекатор изображения, ну из предыдущей команды должно быть понятно зачем
  24. $img->set_img($img);
  25. # Печатаем текст на картинку
  26. # должны быть свой шрифт, смотрите чтоб шрифт поддерживал, то что печатаем
  27. # text(текст,шрифт,цвет в виде #000000,размер,угол,координата x,координата y,прозрачность от 0-непрозрачно до 127 - обсалютно прозрачно)
  28. $img->text("STARTS","action.ttf","#ffffff",30,-50,10,10,0);
  29. # Выводит картинку на экран
  30. $img->output();
  31. # Освобождает память от изображения
  32. $img->destroy();
  33. # возращает массив данных на текущий момент array('w'=>'длинна изображения','h'='высота')
  34. $imglogo->sxy();
  35. # Произвести принудительную замену типа изображения, доступные значение для $type:
  36. # 1=GIF ; 2=JPEG; 3=PNG
  37. $img->set_type(1);
  38. # Метод получения расширения картинки, метод предназначен для использования в методе save, но может кому понадобится
  39. # метод не имеет аргументов
  40. $img->extension();
  41.  




Ну и собственно как примеры использования:

Вариант 1:

PHP:
скопировать код в буфер обмена
  1. $img=new cms_img;
  2. $img->load("111.jpg");
  3. $img->setlogo("logo.png",1);
  4. $img->set_type(1); // изменяем тип изображения на GIF
  5. $img->save("2"); // сохранится с именем 2
  6. $img->save("2",1); // сохранится с именем 2.gif
  7. $img->output();
  8. $img->destroy();




Вариант 2:

PHP:
скопировать код в буфер обмена
  1. $img=new cms_img;
  2. $img->create(350,350,"#000000");
  3. $im=$img->return_img();
  4. $text_color = imagecolorallocate ($im, 233, 14, 91);
  5. imagestring ($im, 50, 5, 5,"A Simple Text String", $text_color);
  6. $img->set_img($im);
  7. $img->save("2.jpg");
  8. $img->output();
  9. $img->destroy();




Вариант 3:

PHP:
скопировать код в буфер обмена
  1. $img=new cms_img;
  2. $img->load("111.jpg");
  3. $img->resize(60);
  4. $img->save("2.jpg");
  5. $img->output();
  6. $img->destroy();




Вариант 4:

PHP:
скопировать код в буфер обмена
  1. $img=new cms_img;
  2. $img->load("111.jpg");
  3. $img->resize(180,150);
  4. $img->save("2.jpg");
  5. $img->output();
  6. $img->destroy();




Вариант 5:

PHP:
скопировать код в буфер обмена
  1. $img=new cms_img;
  2. $img->load("111.jpg");
  3. $img->text("CLASS CMS_IMG","action.ttf","#F5a50f",30,-30,20,20,100);
  4. $img->save("2.jpg");
  5. $img->output();
  6. $img->destroy();




Вариант 6:
Вот тут даже математику добавил с вычислением угла под которым в диагонали накладывать надпись

PHP:
скопировать код в буфер обмена
  1. $text="TEXT TEXT";
  2. $img=new cms_img;
  3. $img->load("660.jpg");
  4. $sxy=$img->sxy();
  5. $sxy['g']=hypot ($sxy['w'],$sxy['h']);
  6. $st=($sxy['h']==min($sxy['w'],$sxy['h']))?$sxy['h']:$sxy['w'];
  7. $gr=floor(rad2deg($st*sin(90)/$sxy['g']));
  8. $size= ceil(($sxy['w']+$sxy['h'])/2/strlen($text));
  9. $ot_w=ceil($sxy['w']-$size*strlen($text)+30);
  10. $img->text($text,"SKURRI.TTF","#Ffffff",$size,$gr,$ot_w,ceil($sxy['h']/100*80),110);
  11. $img->output();
  12. $img->destroy();




Вариант 7:

PHP:
скопировать код в буфер обмена
  1. $img=new cms_img;
  2. $img->load_url('http://vi.sualize.us/thumbs/09/02/02/animal,animals,bitty2,cat,cute-a966d93a53edd4728202920b20aebbfd_h.jpg',tmp/tmp.png');
  3. $img->resize(50);
  4. $img->output();
  5. $img->save("img1.gif");
  6. $img->destroy();



Жду комментариев!
Скачать файл: cms_img.php
Скачан раз: 325

(Отредактировано автором: 05 Марта, 2011 - 21:46:20)

 
 Top
garvey
Отправлено: 05 Марта, 2011 - 12:33:42
Post Id



Частый посетитель


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


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




Вот и комментарии:
1. Уже давно php 5 c областями видимости. Зачем свойства класса определять как public. Это будет вводить в заблуждение пользователей данного класса.
2. Никакой обработки ошибок. Вот взял я ваш класс, а он не работает. И как мне узнать, что не работает? Возьму я в try-catch блок вызов класса. А throw нигде не пробрасывается.
3. $this->coordinate и $this->coordinat. Может стоит назвать получше. Вообще, с названиями у вас плохо.
4. У вас много переменных внутри методов, которые не инициализированы в начале класса. Это неудобно.
5. В некоторых методах слишком много конструкций if. Проще заменить на switch.
6. Ну и, конечно же, велосипед)
 
 Top
ALEN Модератор
Отправлено: 05 Марта, 2011 - 14:41:06
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


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




garvey
0) Отвечаю на половину вопросов сразу, я не претендую на нобелевскую премию и т.д. Я написал класс для своих нужд.
1) По поводу облости видимости - прав, со временем доведу класс до ума, но пока некогда этим заниматся, главное я свои задачи решил
2) По поводу ошибок так же можно поправить, но повторюсь класс сделан для меня, а я первое все ошибки проверяю сам, а если, что не будет работать - быстро найду, со временем так же можно и обработку будет реализовать.
3) $this->coordinate - обрати внимание, что это свойство передается в методе setlogo вторым аргументом. И передавать ее другим способом не стоит. Не спорю виноват я, но я писал для себя, а остальным если подойдет, то пожалуйста я не жадный, вопросы просто такого плана задаются часто, а тут неплохое решение выложил.
4) Если я решу сделать это на совесть и выкладывать, как продукт, пускай даже бесплатный, то обязательно доведу класс до ума, проставлю везде комментарии и т.д.
5) Реально не вижу в данном случае преимуществ switch перед if - и это уже вопрос стиля, а не корректности кода.
6) Ну тут уже не раз ответил. Я написал для себя. Для многих это будет выход. Заниматься доведением до ума, чтоб это было очень красиво и понятно всем - сори пока нет времени.

P.S. Если есть желающие, которые сами все поправят - пожалуйста.
 
 Top
garvey
Отправлено: 05 Марта, 2011 - 14:54:06
Post Id



Частый посетитель


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


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




На самом деле, я одобряю написание велосипедов. Они порой помогают больше вникнуть в суть проблемы. Ну если для своих нужд, то для начала сойдет) Желаю удачи в совершенствовании класса.
 
 Top
ALEN Модератор
Отправлено: 05 Марта, 2011 - 15:50:06
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


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




garvey
Слушай, а где ты видел вообще подобное, есть линк, а то искал до этого не нашел, сейчас просто любопытство мучает.
 
 Top
garvey
Отправлено: 05 Марта, 2011 - 16:06:50
Post Id



Частый посетитель


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


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




Ну вот на моем текущем проекте мы используем вот такую библиотеку. Не совсем аналогично, но похоже.
Спойлер (Отобразить)

Ну и, если использовать Zend Framework, можно воспользоваться следующим решением: http://www.pamparam.net/post/resize-zend-framework.
 
 Top
ALEN Модератор
Отправлено: 05 Марта, 2011 - 16:10:31
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


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




garvey
Ну там только изменение размеров изображения, мне то нужно было вставлять логотип и надписи, притом - функционально, поэтому так много настроек особенно для метода text() .
 
 Top
garvey
Отправлено: 05 Марта, 2011 - 16:17:11
Post Id



Частый посетитель


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


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




Да ладно. Я уже не спорю, что класс не велосипед. Но подкорректировать ег стоит)
 
 Top
ALEN Модератор
Отправлено: 05 Марта, 2011 - 16:33:43
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


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




garvey
Муза моя придет и тогда обязательно подкорректирую))) Тем более, что там ничего существенного нет. Главное, что я при изменении изображения проверяю данные, чтоб ужаса не было.

Кстати пока гулял ))) Возникла идея кэшировать изображение, только вот думаю как лучше, есть 2 варианта склоняюсь к реализации обоих одновременно (можно переключать).

1) Кэшировать с помощью memcache, чтоб можно было передавать идентификатор и картинка была в кэше. В сам метод - передавать массив с настройками к memcache и идентификатор.
2) Передавать так же идентификатор и вторым необязательным параметром, по умолчанию например=tmp/ директорию к временным файлам, т.е. чтоб временное хранилище было в файлах и третьим аргументом передавать файл за какой период искать, там же создавать файл с БД, хранить в нем идентификатор, время создания и адрес к временному файлу, если файл старше нужного периода, то его удалять (если указано), если нет то с него вытаскивать значения, а не генерировать снова

Какие будут замечания, идеи или пожелания? А то если галерея будет приличная нагрузка без кэширования.
 
 Top
LifePlay
Отправлено: 14 Марта, 2011 - 10:18:41
Post Id



Частый гость


Покинул форум
Сообщений всего: 135
Дата рег-ции: Авг. 2010  
Откуда: Кобеляки, Украина


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




Спасибо за класс. Буду разбираться. Круто
 
 Top
Viper
Отправлено: 14 Марта, 2011 - 10:35:15
Post Id



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


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


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





Вот ещё один велосипед который решил мои нужды на стопиццот процентов Хорошо
http://www[dot]verot[dot]net/php_class_upload[dot]htm

(Отредактировано автором: 14 Марта, 2011 - 10:35:35)



-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
ALEN Модератор
Отправлено: 14 Марта, 2011 - 10:39:07
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


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




Viper
класс неплохой, но у меня немного другие задачи были при написании своего.
Со временем подумаю над расширением функционала, например до изменения формата изображения на выходе.
 
 Top
EuGen Администратор
Отправлено: 14 Марта, 2011 - 10:48:41
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Понимаю, что критиковать много легче, чем создавать что-либо, но все же укажу на ряд ошибок, которые, на мой взгляд, могут быть важными:
0. Стоит использовать __construct и __destruct (конструктор и деструктор), так как это облегчает восприятие и понимание процессов внутри класса
1. Названия методов очень неочевидны и зачастую перекликаются одно с другим. fsave и save и т.п.
2. Названия методов и свойств очень желательно стилизовать единообразно. То есть, например, fsave и load_img одновременно - может вызвать трудности, каждый раз придется вспоминать, как же назван тот или иной метод (f_save? или же loadimg .. или ... кхм, пойду, посмотрю класс)
3. Уверен, некоторые методы необходимы только для внутреннего использования, их нужно закрыть от внешнего пространства (при помощи protected или даже private).
4. Желательно анонсировать набор методов и свойств, предоставляемых классом, при помощи соответствующего интерфейса. (хоть это и опционально)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
ALEN Модератор
Отправлено: 14 Марта, 2011 - 10:56:08
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


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




0) Например, что туда в данный момент предлагаешь поместить?
__destruct - еще понятно, а вот для __construct - пока работы не нашел, а писать, чтоб було не очень хочется.

1) Тут проблема не в имени метода, а как уже говорилось - в области видимости.
2) смотри пункт 1
3) туда же в 1 , да и уже вроде все ясно стало
4) ну нужно и интерфейсы и ошибки ловить, не все сразу))) Я то все делаю по мере свободного времени и поставленных задач.
 
 Top
EuGen Администратор
Отправлено: 14 Марта, 2011 - 11:00:48
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Не понял, как область видимости соотносится с именем метода. Имена мы задаем сами, при этом желательно следовать единообразному правилу (а для имен переменных/свойств класса хорошим решением будет еще и указание типа переменной в имени, т.к. php слаботипизарованный язык - например, iCount, rgProperties и т.п.). Области видимости же мы задаем явно, с помощью public/protected/private
Или я просто чего-то не понял? Гм, мне к примеру не очевидно из имени "fsave" или скажем "text" какой это метод. Я вижу только что он объявлен без указания области видимости, то есть по-умолчанию - public.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Пользовательские функции »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB