fork download
  1. <?php
  2. /**
  3.  * Kama Thumbnail
  4.  *
  5.  * @author Kama (fork by Romeo)
  6.  * @url http://w...content-available-to-author-only...a.ru/?p=142
  7.  * @version 1.4.3
  8.  */
  9. class Thumb
  10. {
  11. /**
  12. * ссылка на картинку, когда нет фото (заглушка)
  13. *(Пример: /wp-content/plugins/kama-thumbnail/no_photo.jpg)
  14. */
  15. public $link_to_no_photo = '';
  16.  
  17. /**
  18. * путь до папки, куда будут создаваться миниатюры (от корня сайта). Нужны права на запись777
  19. * (Пример: /wp-content/plugins/kama-thumbnail/thumb)
  20. */
  21. public $cache_folder = '/assets/cache';
  22.  
  23. /**
  24. * поддомены на котором могут быть исходные картинки (через запятую): img.site.ru,img2.site.ru
  25. */
  26. public $subdomen = '';
  27.  
  28. /**
  29. * var not edit
  30. */
  31. public $src;
  32. public $width;
  33. public $height;
  34. public $quality;
  35. public $no_stub;
  36. public $no_attr;
  37.  
  38. private $_args;
  39.  
  40.  
  41. /**
  42. * Создает миниатюру
  43. *
  44. * @return string|bool - ссылку на миниатюру
  45. */
  46. private function _makeFile()
  47. {
  48. $psrc = parse_url($this->src);
  49.  
  50. /* картинка не определена */
  51. if(!isset($psrc['path'])) {
  52.  
  53. return false;
  54. }
  55.  
  56. $doc_root = $_SERVER['DOCUMENT_ROOT'];
  57. if (isset($psrc['host']) && strpos($this->subdomen, $psrc['host']) !== false) {
  58. $doc_root = str_replace($_SERVER['HTTP_HOST'], $psrc['host'], $doc_root);
  59. }
  60.  
  61. /* собираем абс. путь */
  62. $src = $doc_root . '/' . $psrc['path'];
  63.  
  64. /* если src пуст или изображение отсутствует */
  65. if (empty($psrc['path']) || !file_exists($src)) {
  66. if ($this->no_stub === true) {
  67.  
  68. return false;
  69. }
  70. //$src = $this->link_to_no_photo;
  71. }
  72. /**/
  73.  
  74. //$file_name = substr( md5($psrc['path']), -9);
  75. $file_name = substr(md5_file($src), -16);
  76.  
  77. $image_info = getimagesize($_SERVER['DOCUMENT_ROOT'] . $this->src);
  78. $image_type = $image_info[2];
  79. if ($image_type == IMAGETYPE_JPEG) {
  80. $image_ext = '.jpg';
  81. } elseif ($image_type == IMAGETYPE_GIF) {
  82. $image_ext = '.gif';
  83. } elseif ($image_type == IMAGETYPE_PNG) {
  84. $image_ext = '.png';
  85. } else {
  86. $image_ext= '';
  87. }
  88.  
  89. $file_name = $file_name . '_' . $this->width . 'x' . $this->height . $image_ext;
  90.  
  91. /* файл миниатюры от корня сайта */
  92. $dest = $_SERVER['DOCUMENT_ROOT'] . '/' . $this->cache_folder . '/' . $file_name;
  93.  
  94. /* ссылка на изображение */
  95. $out_link = $this->cache_folder . '/' . $file_name;
  96.  
  97. /* если миниатюра уже есть, то возвращаем */
  98. if (file_exists($dest)) {
  99.  
  100. return $out_link;
  101. } elseif($this->_makeThumb($src, $this->width, $this->height, $this->quality, $dest)) {
  102.  
  103. return $out_link;
  104. }
  105.  
  106. return false;
  107. }
  108.  
  109.  
  110. /**
  111.   * Создание и запись файла-картинки
  112.   *
  113.   * @param string $src
  114.   * @param int $width
  115.   * @param int $height
  116.   * @param int $quality
  117.   * @param string $dest
  118.   * @return bool
  119.   */
  120. private function _makeThumb($src, $width, $height, $quality, $dest){
  121.  
  122. if (($size = @getimagesize($src)) === false) {
  123.  
  124. return false;
  125. }
  126.  
  127. $w_file = $size[0];
  128. $h_file = $size[1];
  129.  
  130. /* если не указана одна из сторон задаем ей пропорциональное значение */
  131. if (empty($width)) {
  132. $width = round($w_file * ($height / $h_file));
  133. }
  134. if(empty($height)) {
  135. $height = round($h_file * ($width / $w_file));
  136. }
  137.  
  138. /* Определяем исходный формат по MIME-информации и выбираем
  139. соответствующую imagecreatefrom-функцию. */
  140. $format = strtolower(substr($size['mime'], strpos($size['mime'], '/') + 1));
  141. $icfunc = 'imagecreatefrom' . $format;
  142.  
  143. /* не существует подходящей функции преобразования */
  144. if (!function_exists($icfunc)) {
  145.  
  146. return false;
  147. }
  148. $isrc=$icfunc($src);
  149.  
  150. /* Создаем холст полноцветного изображения */
  151. $idest = imagecreatetruecolor($width, $height);
  152.  
  153. /* Создаем прозрачный канал слоя */
  154. $color = imagecolorallocatealpha($idest, 0, 0, 0, 127);
  155.  
  156. /* Заливка холста новыми каналами */
  157. imagefill($idest, 0, 0, $color);
  158.  
  159. /* Ставим флаг сохраняющий прозрачный канал */
  160. imagesavealpha($idest, true);
  161.  
  162. /* Определяем необходимость преобразования размера так чтоб
  163. вписывалась наименьшая сторона */
  164. #if( $width<$w_file || $height<$h_file )
  165. $ratio = max($width/$w_file, $height/$h_file);
  166.  
  167. $dx = $dy = 0;
  168.  
  169. /* срезать справа и/или слева
  170. отступ слева у источника */
  171. if ($height/$h_file > $width/$w_file) {
  172. $dx = round(($w_file - $width*$h_file/$height)/2 );
  173.  
  174. /* срезать верх и низ отступ сверху у источника *6/10 - чтобы
  175. для вертикальных фоток отступ сверху был не половина а процентов 30*/
  176. } else {
  177. $dy = round(($h_file - $height * $w_file / $width) / 2*6/10 );
  178. }
  179.  
  180. /* сколько пикселей считывать c источника */
  181. $wsrc = round($width / $ratio); /* по ширине */
  182. $hsrc = round($height / $ratio); /* по высоте */
  183.  
  184. imagecopyresampled($idest, $isrc, 0, 0, $dx, $dy, $width, $height, $wsrc, $hsrc);
  185.  
  186. if ($format=='png'){
  187. $quality = floor ($quality * 0.09);
  188. imagepng($idest,$dest,$quality);
  189. } else {
  190. imagejpeg($idest,$dest,$quality);
  191. }
  192. chmod($dest, 0777);
  193. imagedestroy($isrc);
  194. imagedestroy($idest);
  195.  
  196. return true;
  197. }
  198.  
  199.  
  200. /**
  201.   * Инициализация аргументов
  202.   *
  203.   * @param string $args
  204.   * @return boolean
  205.   */
  206. private function _setArgs($args) {
  207.  
  208. /* удаление всех сиволов \s и парсинг строки, как ссылки */
  209. parse_str(preg_replace('/[\n\r\t]+/', '', $args), $this->_args);
  210. if (empty($this->_args)) {
  211.  
  212. return false;
  213. }
  214.  
  215. $arr_args = $this->_args;
  216. $this->width = !empty($arr_args['w']) ? trim($arr_args['w']) : '';
  217. $this->height = !empty($arr_args['h']) ? trim($arr_args['h']) : '';
  218. $this->src = !empty($arr_args['src']) ? trim($arr_args['src']) : '';
  219. $this->quality = !empty($arr_args['q']) ? trim($arr_args['q']) : 85;
  220. $this->no_stub = isset($arr_args['no_stub']) ? true : false;
  221. $this->no_attr = isset($arr_args['no_attr']) ? true : false;
  222.  
  223. if(!isset($this->width) && !isset($this->height)) {
  224. $this->width = $this->height = 100;
  225. }
  226.  
  227. return true;
  228. }
  229.  
  230.  
  231. /**
  232.   * Возвращает только src
  233.   *
  234.   * @param string $args
  235.   * @return string
  236.   */
  237. public function getSrc($args) {
  238. if (empty($args) || !$this->_setArgs($args)) {
  239.  
  240. return '';
  241. }
  242.  
  243. return ($ret = $this->_makeFile()) ? $ret : '';
  244. }
  245.  
  246.  
  247. /**
  248. * Возвращает готовый тег img
  249. *
  250.   * @param string $args
  251. * @return string
  252. */
  253. public function getImg($args) {
  254. if (empty($args) || (!$src = $this->getSrc($args))) {
  255.  
  256. return '';
  257. }
  258.  
  259.  
  260. if ($this->no_attr === false) {
  261. $width = !empty($this->width) ? 'width="' . $this->width . '"' : '';
  262. $height = !empty($this->height) ? 'height="' . $this->height . '"' : '';
  263. } else {
  264. $width = $height = '';
  265. }
  266. $arr_args = $this->_args;
  267. $class = !empty($arr_args['class']) ? 'class="' . trim($arr_args['class']) . '"' : '';
  268. $alt = !empty($arr_args['alt']) ? trim($arr_args['alt']) : '';
  269.  
  270. $ret = '<img ' . $class . ' src="' . $src . '" alt="' . $alt . '" ' . $width . ' ' . $height. ' />';
  271.  
  272. return $ret;
  273. }
  274.  
  275.  
  276. /**
  277. * Возвращает ссылку-картинку
  278. *
  279.   * @param string $args
  280.   * @return string
  281. */
  282. public function getLink($args) {
  283. if (empty($args) || (!$img = $this->getImg($args))) {
  284.  
  285. return '';
  286. }
  287. $ret = '<a href="' . $this->src . '">' . $img . '</a>';
  288.  
  289. return $ret;
  290. }
  291. }
Success #stdin #stdout 0.02s 13064KB
stdin
Standard input is empty
stdout
Standard output is empty