首頁  >  文章  >  後端開發  >  PHP圖片處理函數 類別 (水印圖,縮圖)[關於等比例壓縮與裁切壓縮]

PHP圖片處理函數 類別 (水印圖,縮圖)[關於等比例壓縮與裁切壓縮]

WBOY
WBOY原創
2016-07-25 08:44:29954瀏覽
下面簡單的寫了一個圖片處理類,功能包括:水印,縮圖等。
不過,對於產生縮圖有兩種方式:一種是直接按比例來壓縮圖片,另一種是先裁剪再壓縮的方式。在自己看來等例壓縮與裁切壓縮差異就在於:
等例壓縮:能確保圖片的寬長比例合理,且圖片有完整性。但實際大小不保證符合要求。
裁剪壓縮: 能保證圖片的寬長比例合理,實際大小也能保證。但圖片完整性不能保證。image.php
  1. /**
  2. *
  3. * 影像處理類別
  4. * @author FC_LAMP
  5. * @internal功能包含:水印,縮圖
  6. */
  7. class Img
  8. {
  9. //圖片格式
  10. private $ exts = array ('jpg', 'jpeg', 'gif', 'bmp', 'png' );
  11. /**
  12. *
  13. *
  14. * @拋出異常
  15. */
  16. public function __construct()
  17. {
  18. if (! function_exists ( 'gd_info' ))
  19. {
  20. throw new Exception ( '載入GD函式庫失敗!' );
  21. }
  22. }
  23. /**
  24. *
  25. * 裁切壓縮
  26. * @param $src_img 圖片
  27. * @param $save_img 產生後的圖片
  28. * @param $option 參數選項,包括: $maxwidth 寬$maxheight 寬$
  29. * array('width'=>xx,'height'=>xxx)
  30. * @internal
  31. * 我們一般的壓縮圖片方法,在圖片過長或過寬時產生的圖片
  32. * 都會被“壓扁”,針對這個應採用先裁剪後按比例壓縮的方法
  33. */
  34. public function thumb_img($src_img, $save_img = '', $option)
  35. {
  36. {
  37. if (empty ( $option ['width'] ) or empty ( $option ['height'] ))
  38. {
  39. return array ('flag' => False, 'msg' => '原圖長度與寬度不能小於0' );
  40. }
  41. $org_ext = $this->is_img ( $src_img );
  42. if (! $org_ext ['flag'])
  43. {
  44. return $org_ext;
  45. }
  46. //如果有保存路徑,則確定路徑是否正確
  47. if (! empty ( $save_img ))
  48. {
  49. $f = $this->check_dir ( $save_img );
  50. if (! $f ['flag'])
  51. {
  52. return $f;
  53. }
  54. }
  55. //取得對應的方法
  56. $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );
  57. //取得原始大小
  58. $source = $org_funcs ['create_func '] ( $src_img );
  59. $src_w = imagesx ( $source );
  60. $src_h = imagesy ( $source );
  61. //調整原始影像(保持圖片原始形狀影像)
  62. $dst_scale = $option ['height'] / $option ['width']; //目標影像長寬比
  63. $src_scale = $src_h / $src_w; // 原圖長寬比 if ($src_scale >= $dst_scale)
  64. { // 過高
  65. $w = intval ( $src_w );
  66. $h = intval ( $dst_scale * $w );
  67. $x = 0;
  68. $y = ($src_h - $h) / 3;
  69. } else
  70. { // 過寬
  71. $h = intval ( $src_h );
  72. $w = intval ( $h / $dst_scale );
  73. $x = ($src_w - $w) / 2;
  74. $y = 0;
  75. }
  76. // 剪裁
  77. $croped = imagecreatetruecolor ( $w, $h );
  78. imagecopy ( $croped, $source, 0, 0, $x, $y, $src_w, $src_h );
  79. // 縮放
  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. //輸出(存檔)圖片
  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. * 等比例縮放影像
  101. * @param $src_img 原始圖片
  102. * @param $save_img 需要儲存的地方
  103. * @param $option 參數設定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. //如果有保存路徑,確定路徑是否正確
  114. if (! empty ( $save_img ))
  115. {
  116. $f = $this->check_dir ( $save_img );
  117. if (! $f ['flag'])
  118. {
  119. return $f;
  120. }
  121. }
  122. //取得對應的方法
  123. $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );
  124. //取得原始大小
  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. true; }
  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 else
  143. $ratio = $heightratio;
  144. }
  145. if ($resizewidth_tag && ! $resizeheight_tag)
  146. $ratio = $widthratio; $ratio = $heightratio;
  147. $newwidth = $src_w * $ratio;
  148. $newheight = $src_h * $ratio;
  149. $newheight = $src_h * $ratio;
  150. $ " ))
  151. {
  152. $newim = imagecreatetruecolor ( $newwidth, $newheight );
  153. imagecopyresampled ( $newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_neww. $src_h );
  154. } else
  155. {
  156. $newim = imagecreate ( $newwidth, $newheight );
  157. imagecopyresized ( $newim, $source, 0, 0, 0,0, $newwid $newheight, $src_w, $src_h );
  158. }
  159. }
  160. //輸出(存檔)圖片
  161. if (! empty ( $save_img ))
  162. {
  163. $org_funcs ['save_func'] ( $newim, $save_img );
  164. } else
  165. {
  166. header ( $org_funcs ['header'] );
  167. $org_funcs ['save_func'] ( $newim );
  168. }
  169. imagedestroy ( $newim );
  170. }
  171. imagedestroy ( $newim );
  172. return array ('flag' => True, 'msg' => '' );
  173. }
  174. /**
  175. *
  176. * 產生水印圖片
  177. * @param $org_img 原始圖像
  178. * @param $mark_img 水印標記圖像
  179. * @param $save_img 當其目錄不存在時,會試著建立目錄
  180. * @param array $option 為水印的一些基本設定包含:
  181. * x:水印的水平位置,預設為減去水印圖寬度後的值
  182. * y:水印的垂直位置,預設為減去水印圖高度後的值
  183. * alpha:alpha值(控制透明度),預設為50
  184. */
  185. public function water_mark($org_img, $mark_img , $save_img = '', $option = array())
  186. {
  187. //檢查圖片
  188. $org_ext = $this->is_img ( $org_img );
  189. if (! $org_ext [ 'flag'])
  190. {
  191. return $org_ext;
  192. }
  193. $mark_ext = $this->is_img ( $mark_img );
  194. if (! $mark_ext ['flag'])
  195. {
  196. return $mark_ext;
  197. }
  198. //如果有保存路徑,則確定路徑是否正確
  199. if (! empty ( $save_img ))
  200. {
  201. $ $ f = $this->check_dir ( $save_img );
  202. if (! $f ['flag'])
  203. {
  204. return $f;
  205. }
  206. }
  207. //取得對應畫布
  208. $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );
  209. $org_img_im = $org_funcs ['create_func'] ( $org_img ); $mark_funcs = $this->get_img_funcs ( $mark_ext ['msg'] );
  210. $mark_img_im = $mark_funcs ['create_func'] ( $mark_img );
  211. //
  212. $mark_img_im_x = 0;
  213. $mark_img_im_y = 0;
  214. //拷貝水印圖像高寬
  215. $mark_img_w = imagesx ( $mark_img_im );
  216. $org_img_w = imagesx ( $org_img_im );
  217. $org_img_h = imagesx ( $org_img_im );
  218. //合成產生點坐標
  219. $org_img_im_x = isset ( $option ['x'] ) ? $option ['x'] : $x;
  220. $org_img_im_x = ($org_img_im_x > $org_img_w or $org_im_x = ($org_img_im_x > $org_img_w or $org_img_im_x $y = $org_img_h - $mark_img_h;
  221. $org_img_im_y = isset ( $option ['y'] ) ? $option ['y'] : $y;
  222. $org_img_im_im_im_im_im_im_im_ $org_img_im_y > $org_img_h 或 $org_img_im_y
  223. //alpha
  224. $alpha = isset ( $option ['alpha'] ) ? ] : 50;
  225. $alpha = ($alpha > 100 or $alpha
  226. //合併圖片
  227. imagecopymerge ( $org_img_im, $mark_imgim_ $ , $org_img_im_y, $mark_img_im_x, $mark_img_im_y, $mark_img_w, $mark_img_h, $alpha );
  228. //輸出(存)圖片
  229. if (! empty ( $save_imgol) 🎜>
  230. $org_funcs ['save_func'] ( $org_img_im, $save_img );
  231. } else
  232. {
  233. header ( $org_funcs ['header'] );
  234. header ( $org_funcs ['header'] );
  235. save_func'] ( $org_img_im );
  236. }
  237. //銷毀畫布
  238. imagedestroy ( $org_img_im );
  239. imagedestroy ( $markmark_img_im ); return 'msg' => '' );
  240. }
  241. /**
  242. *
  243. * 檢查圖片
  244. * @param unknown_type $img_path
  245. * @return array('flag'=>true/false,'msg'=>ext/錯誤訊息)
  246. */
  247. private function is_img($img_path)
  248. {
  249. if (! file_exists ( $img_path ))
  250. {
  251. return array ('flag' => False, 'msg' => "載入圖片$img_path 失敗! " );
  252. }
  253. $ext = explode ( '.', $img_path );
  254. $ext = strtolower ( end ( $ext ) );
  255. if (! in_array ( $ext, $ this->exts ))
  256. {
  257. return array ('flag' => False, 'msg' => "圖片$img_path 格式不正確!" );
  258. }
  259. 回傳備份 ('flag' => True, 'msg' => $ext );
  260. }
  261. /**
  262. *
  263. * 傳回正確的圖片函數
  264. * @param unknown_type $ext
  265. */
  266. private function get_img_funcs($ext)
  267. {
  268. //選擇
  269. switch ($ext)
  270. {
  271. case 'jpg' :
  272. $header = 'Content-Type: image/ jpeg';
  273. $createfunc = 'imagecreatefromjpeg';
  274. $savefunc = 'imagejpeg';
  275. 中斷;
  276. case 'jpeg' :
  277. $header = 'Content-Type:image /jpeg ';
  278. $createfunc = 'imagecreatefromjpeg';
  279. $savefunc = 'imagejpeg';
  280. 中斷;
  281. case 'gif' :
  282. $header = 'Content-Type:image/ gif' ;
  283. $createfunc = 'imagecreatefromgif';
  284. $savefunc = 'imagegif';
  285. 中斷;
  286. case 'bmp' :
  287. $header = 'Content-Type:image/bmp ';
  288. $createfunc = 'imagecreatefrombmp';
  289. $savefunc = 'imagebmp';
  290. 中斷;
  291. 預設:
  292. $header = 'Content-Type:image/png';
  293. $
  294. $ $savefunc = 'imagepng';
  295. }
  296. 回傳陣列('save_func' => $savefunc, 'create_func' => $createfunc, 'header' => $header ) ;
  297. }
  298. /**
  299. *
  300. * 檢查並試著建立目錄
  301. * @param $save_img
  302. */
  303. 內部函數check_dir($save_img)
  304. {
  305. $dir = 名目錄( $save_img ) (! is_ir (! is_ir); $dir ))
  306. {
  307. if (! mkdir ( $dir, 0777, true ))
  308. {
  309. return array ('flag' => False, 'msg' => "圖片儲存目錄 $dir 無法建立!" );
  310. }
  311. }
  312. return array ('flag' => True, 'msg' => '' );
  313. }
  314. }
  315. if (!empty ( $_FILES ['test'] ['tmp_name'] ))
  316. {
  317. // 範例
  318. $img = new Img ();
  319. //原圖
  320. $name = spread ( '.', $_FILES [ 'test'] ['name'] );
  321. $org_img = 'D:/test.' end ( $name );
  322. move_uploaded_file ( $_FILES ['test'] ['tmp_name'], $org_img );
  323. $option = array('width' => $_POST ['width'], ' height' => $_POST ['height'] );
  324. if ($_POST ['type'] == 1)
  325. {
  326. $s = $img->resize_image ( $org_img , ' ' , $option );
  327. } else
  328. {
  329. $img->thumb_img ( $org_img, '', $option );
  330. }
  331. 取消連結( $org_img );
  332. }
複製程式碼

使用方式:

浮水印
  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 ); 🎜>
  9. 複製程式碼
調節$option的大小值:


$option = array ('寬度' => 200, '高度' => 200);


  1. 浮水印與壓縮圖
$img = new Img ();//原圖$org_img = 'D:/tt.png';/////水印標記圖$mark_img = 'D:/t.png';//儲存浮水印圖片$save_img = 'D:/test99h/testone/sss.png';//水印設定調整$option = array('x' => 50, 'y' => 50, 'alpha' => 60 );//產生浮水印圖片$flag = $img- >water_mark ( $org_img, $mark_img, $save_img, $option );//壓縮水印圖片$option = array('width' => 200, 'height' =>; 200 );//儲存壓縮圖$save_img2 = 'D:/test99h/testone/sss2_thumb.png';$flag = $img->thumb_img ( $save_img, $save_img2, $img->thumb_img ( $save_img, $save_img2, $img->thumb_img); //等比例壓縮類似複製程式碼
在壓縮產生的水印影像時,壓縮後產生的影像格式應與原始影像,浮水印影像一致。不然,會出現一些未知錯誤。

另註:圖片壓縮原理非本人所創。
圖片處理, 等比例, PHP


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn