国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Home Backend Development PHP Tutorial 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]

Jul 25, 2016 am 08:44 AM

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 無(wú)法創(chuàng)建!" );
  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. }
復(fù)制代碼

使用方式:

水印
  1. $img = new Img ();
  2. $org_img = 'D:/tt.png';
  3. $mark_img = 'D:/t.png';
  4. //保存水印圖片(如果$save_img為空時(shí),將會(huì)直接輸出圖片)
  5. $save_img = 'D:/test99h/testone/sss.png';
  6. //水印設(shè)置調(diào)節(jié)
  7. $option = array ('x' => 50, 'y' => 50, 'alpha' => 80 );
  8. //生成水印圖片
  9. $flag = $img->water_mark ( $org_img, $mark_img, $save_img, $option );
復(fù)制代碼

當(dāng)我們調(diào)節(jié) $option 參數(shù)時(shí),會(huì)有相應(yīng)變化:

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

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


3 如果你不設(shè)置$option 參數(shù),將會(huì)采用默認(rèn)值:

如果要純文字式的水印,可以參看這里: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為空時(shí),將會(huì)直接輸出圖像到瀏覽器
  7. $save_img = 'D:/test99h/testone/sss_thumb.png';
  8. $flag = $img->thumb_img ( $org_img, $save_img, $option );
復(fù)制代碼

調(diào)節(jié)$option的大小值:
  1. $option = array ('width' => 200, 'height' => 200);
復(fù)制代碼

水印與壓縮圖
  1. $img = new Img ();
  2. //原圖
  3. $org_img = 'D:/tt.png';
  4. //水印標(biāo)記圖
  5. $mark_img = 'D:/t.png';
  6. //保存水印圖片
  7. $save_img = 'D:/test99h/testone/sss.png';
  8. //水印設(shè)置調(diào)節(jié)
  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 ); //等比例壓縮類似
復(fù)制代碼

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 of this Website
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

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

What are some best practices for versioning a PHP-based API? What are some best practices for versioning a PHP-based API? Jun 14, 2025 am 12:27 AM

ToversionaPHP-basedAPIeffectively,useURL-basedversioningforclarityandeaseofrouting,separateversionedcodetoavoidconflicts,deprecateoldversionswithclearcommunication,andconsidercustomheadersonlywhennecessary.StartbyplacingtheversionintheURL(e.g.,/api/v

How do I implement authentication and authorization in PHP? How do I implement authentication and authorization in PHP? Jun 20, 2025 am 01:03 AM

TosecurelyhandleauthenticationandauthorizationinPHP,followthesesteps:1.Alwayshashpasswordswithpassword_hash()andverifyusingpassword_verify(),usepreparedstatementstopreventSQLinjection,andstoreuserdatain$_SESSIONafterlogin.2.Implementrole-basedaccessc

What are the differences between procedural and object-oriented programming paradigms in PHP? What are the differences between procedural and object-oriented programming paradigms in PHP? Jun 14, 2025 am 12:25 AM

Proceduralandobject-orientedprogramming(OOP)inPHPdiffersignificantlyinstructure,reusability,anddatahandling.1.Proceduralprogrammingusesfunctionsorganizedsequentially,suitableforsmallscripts.2.OOPorganizescodeintoclassesandobjects,modelingreal-worlden

What are weak references (WeakMap) in PHP, and when might they be useful? What are weak references (WeakMap) in PHP, and when might they be useful? Jun 14, 2025 am 12:25 AM

PHPdoesnothaveabuilt-inWeakMapbutoffersWeakReferenceforsimilarfunctionality.1.WeakReferenceallowsholdingreferenceswithoutpreventinggarbagecollection.2.Itisusefulforcaching,eventlisteners,andmetadatawithoutaffectingobjectlifecycles.3.YoucansimulateaWe

How can you handle file uploads securely in PHP? How can you handle file uploads securely in PHP? Jun 19, 2025 am 01:05 AM

To safely handle file uploads in PHP, the core is to verify file types, rename files, and restrict permissions. 1. Use finfo_file() to check the real MIME type, and only specific types such as image/jpeg are allowed; 2. Use uniqid() to generate random file names and store them in non-Web root directory; 3. Limit file size through php.ini and HTML forms, and set directory permissions to 0755; 4. Use ClamAV to scan malware to enhance security. These steps effectively prevent security vulnerabilities and ensure that the file upload process is safe and reliable.

How can you interact with NoSQL databases (e.g., MongoDB, Redis) from PHP? How can you interact with NoSQL databases (e.g., MongoDB, Redis) from PHP? Jun 19, 2025 am 01:07 AM

Yes, PHP can interact with NoSQL databases like MongoDB and Redis through specific extensions or libraries. First, use the MongoDBPHP driver (installed through PECL or Composer) to create client instances and operate databases and collections, supporting insertion, query, aggregation and other operations; second, use the Predis library or phpredis extension to connect to Redis, perform key-value settings and acquisitions, and recommend phpredis for high-performance scenarios, while Predis is convenient for rapid deployment; both are suitable for production environments and are well-documented.

What are the differences between == (loose comparison) and === (strict comparison) in PHP? What are the differences between == (loose comparison) and === (strict comparison) in PHP? Jun 19, 2025 am 01:07 AM

In PHP, the main difference between == and == is the strictness of type checking. ==Type conversion will be performed before comparison, for example, 5=="5" returns true, and ===Request that the value and type are the same before true will be returned, for example, 5==="5" returns false. In usage scenarios, === is more secure and should be used first, and == is only used when type conversion is required.

How do I perform arithmetic operations in PHP ( , -, *, /, %)? How do I perform arithmetic operations in PHP ( , -, *, /, %)? Jun 19, 2025 pm 05:13 PM

The methods of using basic mathematical operations in PHP are as follows: 1. Addition signs support integers and floating-point numbers, and can also be used for variables. String numbers will be automatically converted but not recommended to dependencies; 2. Subtraction signs use - signs, variables are the same, and type conversion is also applicable; 3. Multiplication signs use * signs, which are suitable for numbers and similar strings; 4. Division uses / signs, which need to avoid dividing by zero, and note that the result may be floating-point numbers; 5. Taking the modulus signs can be used to judge odd and even numbers, and when processing negative numbers, the remainder signs are consistent with the dividend. The key to using these operators correctly is to ensure that the data types are clear and the boundary situation is handled well.

See all articles