>백엔드 개발 >PHP 튜토리얼 >이미지 스케일링 워터마크 PHP 클래스

이미지 스케일링 워터마크 PHP 클래스

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

PHP


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