Home  >  Article  >  Backend Development  >  PHP image processing function class (watermark, thumbnail) [About proportional compression and cropping compression]

PHP image processing function class (watermark, thumbnail) [About proportional compression and cropping compression]

WBOY
WBOYOriginal
2016-07-25 08:44:29952browse
Below is a simple picture processing class whose functions include: watermark, thumbnail, etc.
However, there are two ways to generate thumbnails: one is to directly compress the image proportionally, and the other is to crop and then compress the image. In my opinion, the difference between equal-case compression and cropping compression is:
Equal example compression: It can ensure that the width and length ratio of the image is reasonable and the image is complete. However, actual size is not guaranteed to meet requirements.
Cropping and compression: It can ensure that the width and length ratio of the picture is reasonable, and the actual size can also be guaranteed. However, the integrity of the picture cannot be guaranteed.image.php
  1. /**
  2. *
  3. * Image processing class
  4. * @author FC_LAMP
  5. * @internal functions include: watermark, thumbnail
  6. */
  7. class Img
  8. {
  9. //Image format
  10. private $exts = array ('jpg', 'jpeg', 'gif', ' bmp', 'png' );
  11. /**
  12. *
  13. *
  14. * @throws Exception
  15. */
  16. public function __construct()
  17. {
  18. if (! function_exists ( 'gd_info' ))
  19. {
  20. throw new Exception ( 'Failed to load GD library!' );
  21. }
  22. }
  23. /**
  24. *
  25. * Cropping and compression
  26. * @param $src_img image
  27. * @param $save_img generated image
  28. * @param $option parameter options, including: $maxwidth width $maxheight height
  29. * array('width'=> xx,'height'=>xxx)
  30. * @internal
  31. * Our general image compression method, when the image is too long or too wide, the generated image
  32. * will be "squashed". For this, crop first and then Proportional compression method
  33. */
  34. public function thumb_img($src_img, $save_img = '', $option)
  35. {
  36. if (empty ( $option ['width'] ) or empty ( $option ['height'] ))
  37. {
  38. return array ('flag' => False, 'msg' => 'The length and width of the original image cannot be less than 0' );
  39. }
  40. $org_ext = $this->is_img ( $src_img );
  41. if (! $org_ext ['flag'])
  42. {
  43. return $org_ext;
  44. }
  45. //If there is a save path, determine whether the path is correct
  46. if (! empty ( $save_img ))
  47. {
  48. $f = $this->check_dir ( $save_img );
  49. if (! $f ['flag'])
  50. {
  51. return $f;
  52. }
  53. }
  54. // Get the corresponding method
  55. $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );
  56. //Get the original size
  57. $source = $org_funcs ['create_func'] ( $src_img );
  58. $ src_w = imagesx ( $source );
  59. $src_h = imagesy ( $source );
  60. //Adjust the original image (keep the original shape of the image and crop the image)
  61. $dst_scale = $option ['height'] / $option ['width ']; //Target image aspect ratio
  62. $src_scale = $src_h / $src_w; // Original image aspect ratio
  63. if ($src_scale >= $dst_scale)
  64. { // Too high
  65. $w = intval ( $src_w );
  66. $h = intval ( $dst_scale * $w );
  67. $x = 0;
  68. $y = ($src_h - $h) / 3;
  69. } else
  70. { // Too wide
  71. $h = intval ( $src_h );
  72. $w = intval ( $h / $dst_scale );
  73. $x = ($src_w - $w) / 2;
  74. $y = 0;
  75. }
  76. // Cropped
  77. $croped = imagecreatetruecolor ( $w, $h );
  78. imagecopy ( $croped, $source, 0, 0, $x, $y, $src_w, $src_h );
  79. // Scaling
  80. $scale = $option ['width' ] / $w;
  81. $target = imagecreatetruecolor ( $option ['width'], $option ['height'] );
  82. $final_w = intval ( $w * $scale );
  83. $final_h = intval ( $h * $scale );
  84. imagecopyresampled ( $target, $croped, 0, 0, 0, 0, $final_w, $final_h, $w, $h );
  85. imagedestroy ( $croped );
  86. //Output (save) image
  87. if (! empty ( $save_img ))
  88. {
  89. $org_funcs ['save_func'] ( $target, $save_img );
  90. } else
  91. {
  92. header ( $org_funcs ['header'] );
  93. $org_funcs [ 'save_func'] ( $target );
  94. }
  95. imagedestroy ( $target );
  96. return array ('flag' => True, 'msg' => '' );
  97. }
  98. /**
  99. *
  100. * Scale image
  101. * @param $src_img Original image
  102. * @param $save_img Where to save
  103. * @param $option Parameter setting array('width'=>xx,'height'=> xxx)
  104. *
  105. */
  106. function resize_image($src_img, $save_img = '', $option)
  107. {
  108. $org_ext = $this->is_img ( $src_img );
  109. if (! $org_ext ['flag'])
  110. {
  111. return $org_ext;
  112. }
  113. //If there is a save path, determine whether the path is correct
  114. if (! empty ( $save_img ))
  115. {
  116. $f = $this->check_dir ( $save_img );
  117. if ( ! $f ['flag'])
  118. {
  119. return $f;
  120. }
  121. }
  122. //Get the corresponding method
  123. $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );
  124. //Get the original size
  125. $source = $org_funcs ['create_func'] ( $src_img );
  126. $src_w = imagesx ( $source );
  127. $src_h = imagesy ( $source );
  128. if (($option [ 'width'] && $src_w > $option ['width']) || ($option ['height'] && $src_h > $option ['height']))
  129. {
  130. if ($option [' width'] && $src_w > $option ['width'])
  131. {
  132. $widthratio = $option ['width'] / $src_w;
  133. $resizewidth_tag = true;
  134. }
  135. if ($option ['height '] && $src_h > $option ['height'])
  136. {
  137. $heightratio = $option ['height'] / $src_h;
  138. $resizeheight_tag = true;
  139. }
  140. if ($resizewidth_tag && $resizeheight_tag)
  141. {
  142. if ($widthratio < $heightratio)
  143. $ratio = $widthratio;
  144. else
  145. $ratio = $heightratio;
  146. }
  147. if ($resizewidth_tag && ! $resizeheight_tag)
  148. $ratio = $widthratio;
  149. if ($resizeheight_tag && ! $resizewidth_tag)
  150. $ratio = $heightratio;
  151. $newwidth = $src_w * $ratio;
  152. $newheight = $src_h * $ratio;
  153. if (function_exists ( "imagecopyresampled" ))
  154. {
  155. $newim = imagecreatetruecolor ( $newwidth, $newheight );
  156. imagecopyresampled ( $newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $src_h );
  157. } else
  158. {
  159. $newim = imagecreate ( $newwidth, $newheight );
  160. imagecopyresized ( $newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $src_h );
  161. }
  162. }
  163. //Output (save) picture
  164. if (! empty ( $save_img ))
  165. {
  166. $org_funcs ['save_func'] ( $newim, $save_img );
  167. } else
  168. {
  169. header ( $org_funcs ['header '] );
  170. $org_funcs ['save_func'] ( $newim );
  171. }
  172. imagedestroy ( $newim );
  173. return array ('flag' => True, 'msg' => '' );
  174. }
  175. /**
  176. *
  177. * Generate watermark image
  178. * @param $org_img Original image
  179. * @param $mark_img Watermark image
  180. * @param $save_img When its directory does not exist, it will try to create the directory
  181. * @param array $option is Some basic settings of the watermark include:
  182. * x: the horizontal position of the watermark, the default is the value after subtracting the width of the watermark image
  183. * y: the vertical position of the watermark, the default is the value after subtracting the height of the watermark image
  184. * alpha: alpha Value (control transparency), default is 50
  185. */
  186. public function water_mark($org_img, $mark_img, $save_img = '', $option = array())
  187. {
  188. //Check the picture
  189. $org_ext = $this-> is_img ( $org_img );
  190. if (! $org_ext ['flag'])
  191. {
  192. return $org_ext;
  193. }
  194. $mark_ext = $this->is_img ( $mark_img );
  195. if (! $mark_ext [' flag'])
  196. {
  197. return $mark_ext;
  198. }
  199. //If there is a save path, determine whether the path is correct
  200. if (! empty ( $save_img ))
  201. {
  202. $f = $this->check_dir ( $ save_img );
  203. if (! $f ['flag'])
  204. {
  205. return $f;
  206. }
  207. }
  208. //Get the corresponding canvas
  209. $org_funcs = $this->get_img_funcs ( $org_ext ['msg' ] );
  210. $org_img_im = $org_funcs ['create_func'] ( $org_img );
  211. $mark_funcs = $this->get_img_funcs ( $mark_ext ['msg'] );
  212. $mark_img_im = $mark_funcs ['create_func' ] ( $mark_img );
  213. //Copy watermark image coordinates
  214. $mark_img_im_x = 0;
  215. $mark_img_im_y = 0;
  216. //Copy watermark image height and width
  217. $mark_img_w = ​​imagesx ( $mark_img_im );
  218. $mark_img_h = imagesy ( $mark_img_im );
  219. $org_img_w = ​​imagesx ( $org_img_im );
  220. $org_img_h = imagesx ( $org_img_im );
  221. //Synthetic generated point coordinates
  222. $x = $org_img_w - $mark_img_w;
  223. $org_img_im_x = isset ( $ option ['x'] ) ? $option ['x'] : $x;
  224. $org_img_im_x = ($org_img_im_x > $org_img_w or $org_img_im_x < 0) ? $x : $org_img_im_x;
  225. $y = $org_img_h - $mark_img_h;
  226. $org_img_im_y = isset ( $option ['y'] ) ? $option ['y'] : $y;
  227. $org_img_im_y = ($org_img_im_y > $org_img_h or $org_img_im_y < 0) ? $ y : $org_img_im_y;
  228. //alpha
  229. $alpha = isset ( $option ['alpha'] ) ? $option ['alpha'] : 50;
  230. $alpha = ($alpha > 100 or $alpha < 0)? 50: $ Alpha;
  231. // Merge picture
  232. Imagecopymerge ($ ORG_IMG_IM, $ Mark_img_im, $ ORG_IMG_I_X, $ ORG_IMG_IM_Y, $ Mark_img_X, $ Mark_img_im_ y, $ mark_img_w, $mark_img_h, $ alpha);
  233. // output (Save) image
  234. if (! empty ( $save_img ))
  235. {
  236. $org_funcs ['save_func'] ( $org_img_im, $save_img );
  237. } else
  238. {
  239. header ( $org_funcs ['header'] );
  240. $org_funcs ['save_func'] ( $org_img_im );
  241. }
  242. // Destroy the canvas
  243. imagedestroy ( $org_img_im );
  244. imagedestroy ( $mark_img_im );
  245. return array ('flag' => True, 'msg' = > '' );
  246. }
  247. /**
  248. *
  249. * Check the image
  250. * @param unknown_type $img_path
  251. * @return array('flag'=>true/false,'msg'=>ext/error message)
  252. */
  253. private function is_img($img_path)
  254. {
  255. if (! file_exists ( $img_path ))
  256. {
  257. return array ('flag' => ; False, 'msg' => "Failed to load image $img_path! " );
  258. }
  259. $ext = explode ( '.', $img_path );
  260. $ext = strtolower ( end ( $ext ) );
  261. if (! in_array ( $ext, $this->exts ))
  262. {
  263. return array ('flag' => False, 'msg' => "The format of the image $img_path is incorrect!" );
  264. }
  265. return array ('flag' => True, 'msg' => $ext );
  266. }
  267. /**
  268. *
  269. * Return the correct image function
  270. * @param unknown_type $ext
  271. */
  272. private function get_img_funcs($ext)
  273. {
  274. //选择
  275. switch ($ext)
  276. {
  277. case 'jpg' :
  278. $header = 'Content-Type:image/jpeg';
  279. $createfunc = 'imagecreatefromjpeg';
  280. $savefunc = 'imagejpeg';
  281. break;
  282. case 'jpeg' :
  283. $header = 'Content-Type:image/jpeg';
  284. $createfunc = 'imagecreatefromjpeg';
  285. $savefunc = 'imagejpeg';
  286. break;
  287. case 'gif' :
  288. $header = 'Content-Type:image/gif';
  289. $createfunc = 'imagecreatefromgif';
  290. $savefunc = 'imagegif';
  291. break;
  292. case 'bmp' :
  293. $header = 'Content-Type:image/bmp';
  294. $createfunc = 'imagecreatefrombmp';
  295. $savefunc = 'imagebmp';
  296. break;
  297. default :
  298. $header = 'Content-Type:image/png';
  299. $createfunc = 'imagecreatefrompng';
  300. $savefunc = 'imagepng';
  301. }
  302. return array ('save_func' => $savefunc, 'create_func' => $createfunc, 'header' => $header );
  303. }
  304. /**
  305. *
  306. * Check and try to create the directory
  307. * @param $save_img
  308. */
  309. private function check_dir($save_img)
  310. {
  311. $dir = dirname ( $save_img );
  312. if (! is_dir ( $dir ))
  313. {
  314. if (! mkdir ( $dir, 0777, true ))
  315. {
  316. return array ('flag' => False, 'msg' => "图片保存目录 $dir 无法创建!" );
  317. }
  318. }
  319. return array ('flag' => True, 'msg' => '' );
  320. }
  321. }
  322. if (! empty ( $_FILES ['test'] ['tmp_name'] ))
  323. {
  324. //例子
  325. $img = new Img ();
  326. //原图
  327. $name = explode ( '.', $_FILES ['test'] ['name'] );
  328. $org_img = 'D:/test.' . end ( $name );
  329. move_uploaded_file ( $_FILES ['test'] ['tmp_name'], $org_img );
  330. $option = array ('width' => $_POST ['width'], 'height' => $_POST ['height'] );
  331. if ($_POST ['type'] == 1)
  332. {
  333. $s = $img->resize_image ( $org_img, '', $option );
  334. } else
  335. {
  336. $img->thumb_img ( $org_img, '', $option );
  337. }
  338. unlink ( $org_img );
  339. }
复制代码

使用方式:

水印
  1. $img = new Img ();
  2. $org_img = 'D:/tt.png';
  3. $mark_img = 'D:/t.png';
  4. //保存水印图片(如果$save_img为空时,将会直接输出图片)
  5. $save_img = 'D:/test99h/testone/sss.png';
  6. //水印设置调节
  7. $option = array ('x' => 50, 'y' => 50, 'alpha' => 80 );
  8. //生成水印图片
  9. $flag = $img->water_mark ( $org_img, $mark_img, $save_img, $option );
复制代码

当我们调节 $option 参数时,会有相应变化:

1 $option = array ('x' => 0, 'y' => 0, 'alpha' => 50 );

2$option = array ('x' => 50, 'y' => 50, 'alpha' => 80 );


3 如果你不设置$option 参数,将会采用默认值:

如果要纯文字式的水印,可以参看这里:http://www.php.net/manual/zh/image.examples.merged-watermark.php
  1. //例子
  2. $img = new Img ();
  3. $org_img = 'D:/tt.png';
  4. //压缩图片(100*100)
  5. $option = array ('width' => 100, 'height' => 100 );
  6. //$save_img为空时,将会直接输出图像到浏览器
  7. $save_img = 'D:/test99h/testone/sss_thumb.png';
  8. $flag = $img->thumb_img ( $org_img, $save_img, $option );
复制代码

调节$option的大小值:
  1. $option = array ('width' => 200, 'height' => 200);
复制代码

水印与压缩图
  1. $img = new Img ();
  2. //原图
  3. $org_img = 'D:/tt.png';
  4. //水印标记图
  5. $mark_img = 'D:/t.png';
  6. //保存水印图片
  7. $save_img = 'D:/test99h/testone/sss.png';
  8. //水印设置调节
  9. $option = array ('x' => 50, 'y' => 50, 'alpha' => 60 );
  10. //生成水印图片
  11. $flag = $img->water_mark ( $org_img, $mark_img, $save_img, $option );
  12. //压缩水印图片
  13. $option = array ('width' => 200, 'height' => 200 );
  14. //保存压缩图
  15. $save_img2 = 'D:/test99h/testone/sss2_thumb.png';
  16. $flag = $img->thumb_img ( $save_img, $save_img2, $option ); //等比例压缩类似
复制代码

When compressing the generated watermark image, the format of the image generated after compression should be consistent with the original image and watermark image. Otherwise, some unknown errors will occur.

Also note: The image compression principle was not invented by me.
Image processing, proportional, PHP


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn