>  기사  >  백엔드 개발  >  썸네일과 워터마크를 구현하는 PHP 클래스

썸네일과 워터마크를 구현하는 PHP 클래스

WBOY
WBOY원래의
2016-07-25 08:45:09772검색
  1. /**
  2. * 이미지 스케일링 워터마크 클래스
  3. *
  4. * @version 1.0;
  5. *
  6. */
  7. class cls_photo
  8. {
  9. protected $waterrate = 0.2; //이미지에 대한 워터마크 아이콘의 비율
  10. protected $width = 300; //썸네일의 기본 너비
  11. protected $height = 200; //썸네일의 기본 높이
  12. protected $padding = 5 //워터마크에서 가장자리까지의 거리
  13. protected $ water_mark = "./water.png";
  14. protected $water_mark_pos = 5;//워터마크 이미지 위치 (1=왼쪽 위, 2=오른쪽 위, 3=왼쪽 아래, 4=오른쪽 아래, 5 center)
  15. protected $watermode = 0; // 워터마크가 없는 썸네일 0개 워터마크가 있는 썸네일 1개
  16. protected $magick_handle; // 그림 작업 핸들
  17. protected $format = array('jpg','gif', 'png','jpeg'); // 사진 파일 형식 제한
  18. protected $smallpic_mode = 2; //기본 모드 0은 썸네일을 생성하지 않고, 1은 자르기 및 크기 조절, 2는 비례 크기 조절, 3은 크기 조절 및 채우기 모드
  19. /**
  20. * 이미지 매개변수 설정
  21. *
  22. * @param $arg 이미지 매개변수는 다음과 같이 배열에 여러 번 입력할 수 있습니다.
  23. * @param $protected 매개변수 값
  24. * array(
  25. * 'waterrate'=>0.2,
  26. * 'water_mark'=>'./water.png',
  27. * 'water_mark_pos'=>4,
  28. * 'smallpic_mode'=>1
  29. * );
  30. * @return ture/false
  31. */
  32. 공개 함수 set_args($arg,$val="")
  33. {
  34. $params = array('waterrate','water_mark ', 'water_mark_pos','smallpic_mode','watermode','width','height');
  35. if(is_array($arg))
  36. {
  37. foreach ($arg as $k => ;$ v)
  38. {
  39. if(in_array($k,$params))
  40. {
  41. $this->$k = $v;
  42. }
  43. }
  44. }
  45. else
  46. {
  47. if(empty($val))
  48. {
  49. return false;
  50. }
  51. else
  52. {
  53. if(in_array( $arg ,$params))
  54. {
  55. $this->$arg = $val;
  56. }
  57. }
  58. }
  59. return true;
  60. }
  61. /**
  62. * 이미지 크기 조정
  63. *
  64. * @param $src_file 소스 파일 경로
  65. * @param $dst_file 대상 파일 경로
  66. * @return 썸네일 이미지 경로/false
  67. */
  68. 공용 함수 scale($src_file,$dst_file="")
  69. {
  70. $dst_width = $this->width;
  71. $dst_height = $this ->height;
  72. $mode = $this->smallpic_mode;
  73. $magic_water_handle = NewMagickWand();
  74. if (!MagickReadImage($magic_water_handle, $src_file))return false;
  75. //유형
  76. $srcext = strtolower(MagickGetImageFormat($magic_water_handle));
  77. if($srcext=='bmp')
  78. {
  79. $srcext = 'jpeg';
  80. }
  81. if(!in_array($srcext,$this->format))return false;
  82. //Size
  83. $src_width = MagickGetImageWidth($magic_water_handle);
  84. $src_height = MagickGetImageHeight ($ Magic_water_handle);
  85. //자르기 크기 조정 모드
  86. if($mode == 1)
  87. {
  88. $pos_x=$pos_y = 0;//임시 위치 자르기
  89. $src_widthc = $src_width;//임시 너비 자르기
  90. $src_heightc = $src_height;//임시 높이 자르기
  91. if($src_width/$src_height>$dst_width/$dst_height)
  92. {
  93. $ src_widthc = $src_height*$dst_width/$dst_height;
  94. $pos_x = ($src_width-$src_widthc)/2;
  95. }
  96. else
  97. {
  98. $src_heightc = $src_width *$dst_height/$dst_width;
  99. $pos_y = ($src_height-$src_heightc)/2;
  100. }
  101. MagickCropImage($magic_water_handle,$src_widthc,$src_heightc,$pos_x,$pos_y); // 자르기
  102. //MagickCropImage 함수 이후 Gif 이미지는 변경되지만 캔버스는 변경되지 않기 때문입니다
  103. $this->magick_handle = NewMagickWand();
  104. MagickNewImage($this->magick_handle,$src_widthc ,$src_heightc,'#ffffff');
  105. MagickSetFormat($this->magick_handle,$srcext);
  106. MagickCompositeImage($this->magick_handle,$magic_water_handle,MW_OverCompositeOp,0,0);
  107. //Scale
  108. MagickScaleImage($this->magick_handle, $dst_width, $dst_height);
  109. }
  110. //비례 스케일링 모드
  111. if($mode == 2)
  112. {
  113. if($src_width/$src_height>$dst_width/$dst_height)
  114. {
  115. $dst_height=$dst_width*$src_height/$src_width;
  116. }
  117. else
  118. {
  119. $dst_width=$dst_height*$src_width/$src_height;
  120. }
  121. $this->magick_handle=$magic_water_handle;//替换
  122. MagickScaleImage($this->magick_handle, $dst_width, $dst_height);//缩放
  123. }
  124. //缩放填充模式
  125. if($mode == 3)
  126. {
  127. if($src_width/$src_height>$dst_width/$dst_height)
  128. {
  129. $dst_heightc=$dst_width*$src_height/$src_width ;
  130. $dst_widthc=$dst_width;
  131. }
  132. else
  133. {
  134. $dst_widthc=$dst_height*$src_width/$src_height;
  135. $dst_heightc=$dst_height;
  136. }
  137. MagickScaleImage($magic_water_handle, $dst_widthc, $dst_heightc);//缩放
  138. $this->magick_handle = NewMagickWand();
  139. MagickNewImage($this->magick_handle,$dst_width,$dst_height, $this->smallpic_bgcolor);
  140. MagickSetFormat($this->magick_handle,$srcext);
  141. MagickCompositeImage($this->magick_handle,$magic_water_handle,MW_OverCompositeOp,($dst_width-$dst_widthc)/2 ,($dst_height-$dst_heightc)/2);
  142. }
  143. //打水印
  144. if($this->watermode == 1)
  145. {
  146. $this-> set_mark();
  147. }
  148. if(empty($dst_file))
  149. {
  150. //建立临时文件
  151. $dst_file = tempnam($_SERVER["SINASRV_CACHE_DIR"],"TMP_IMG" );
  152. }
  153. MagickWriteImage($this->magick_handle, $dst_file);
  154. return $dst_file;
  155. }
  156. /**
  157. * 워터마크
  158. *
  159. * @param $src_file 워터마크를 생성할 이미지의 경로
  160. * @param $dst_file 워터마크 생성을 위한 파일 저장 경로가 비어 있는 경우 임의의 임시 파일. 제작됩니다
  161. * @return 워터마크 파일 경로/false
  162. */
  163. 공용 함수 water_mark($src_file,$dst_file="")
  164. {
  165. $this->magick_handle = NewMagickWand();
  166. if (!MagickReadImage($this->magick_handle, $src_file))
  167. false 반환;
  168. $this->set_mark();
  169. if(empty($dst_file))
  170. {
  171. //建立临时文件
  172. $dst_file = tempnam($ _SERVER["SINASRV_CACHE_DIR"],"TMP_IMG");
  173. }
  174. MagickWriteImage($this->magick_handle, $dst_file);
  175. return $dst_file;
  176. }
  177. / **
  178. * 내부 인터페이스
  179. * 워터마크 사진
  180. *
  181. */
  182. 보호 함수 set_mark()
  183. {
  184. //尺寸
  185. $dst_width = MagickGetImageWidth($this->magick_handle);
  186. $dst_height = MagickGetImageHeight($this->magick_handle);
  187. //관리수印图
  188. if ($this->water_mark && is_file($this->water_mark))
  189. {
  190. $magic_water_handle = NewMagickWand();
  191. MagickRemoveImage($magic_water_handle);
  192. if (MagickReadImage($magic_water_handle, $this->water_mark))
  193. {
  194. MagickScaleImage($magic_water_handle, $dst_width*$this-> ;waterrate, $dst_width*$this->waterrate*MagickGetImageHeight($magic_water_handle)/MagickGetImageWidth($magic_water_handle));//缩放水印到图 Pictures 1/5
  195. if ($this->water_mark_pos == 1 )
  196. {
  197. $left = $this->padding;
  198. $top = $this->padding;
  199. }
  200. elseif ($this->water_mark_pos == 2)
  201. {
  202. $left = $dst_width-$this->padding-MagickGetImageWidth($magic_water_handle);
  203. $top = $this->padding;
  204. }
  205. elseif($this ->water_mark_pos == 3)
  206. {
  207. $left = $this->padding;
  208. $top = $dst_height -$this->padding-MagickGetImageHeight($magic_water_handle);
  209. }
  210. elseif ($this->water_mark_pos == 4)
  211. {
  212. $left = $dst_width-$this->padding-MagickGetImageWidth($magic_water_handle);
  213. $top =$dst_height -$this->padding-MagickGetImageHeight($magic_water_handle);
  214. }
  215. elseif ($this->water_mark_pos == 5)
  216. {
  217. $left = ($dst_width-MagickGetImageWidth($ Magic_water_handle))/2;
  218. $top =($dst_height -MagickGetImageHeight($magic_water_handle))/2;
  219. }
  220. MagickCompositeImage($this->magick_handle,$magic_water_handle,MW_OverCompositeOp,$left,$ 상단);
  221. }
  222. }
  223. }
  224. }
复代码

허자, PHP


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.