首頁 > 後端開發 > php教程 > php縮圖與圖片浮水印類別(等比縮放圖片大小)

php縮圖與圖片浮水印類別(等比縮放圖片大小)

WBOY
發布: 2016-07-25 08:51:35
原創
1072 人瀏覽過
在壓縮產生的水印影像時,壓縮後產生的影像格式應與原始影像,浮水印影像一致。 否則,會出現一些未知的錯誤。
  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. if (empty ( $option ['width'] ) 或 empty ( $option ['height'] ))

  37. {
  38. return array ('flag' = > False, 'msg' => '原圖長度與寬度不能小於0' );
  39. }
  40. $org_ext = $this->is_img ( $src_img );
  41. if (! $org_ext [' flag'])
  42. {
  43. return $org_ext;
  44. }
  45. //如果有保存路徑,則確定路徑是否正確

  46. if (! empty ( $ save_img ))
  47. {
  48. $f = $this->check_dir ( $save_img );
  49. if (! $f ['flag'])
  50. {
  51. return $f;
  52. }
  53. }
  54. //取得對應的方法

  55. $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );
  56. //取得原始大小

  57. $source = $org_funcs ['create_func'] ( $src_img );
  58. $src_w = imagesx ( $source );
  59. $src_h = imagesy ( $source ) ;
  60. //調整原始影像(保持圖片原形狀裁切影像)

  61. $dst_scale = $option ['height'] / $option ['width']; //目標影像長寬比
  62. $src_scale = $src_h / $src_w; // 原圖長寬比
  63. 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. getagedestro );
  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. return $org_ext;
  111. }
  112. //如果有保存路徑,則確定路徑是否正確

  113. if (! empty ( $save_img ))
  114. {
  115. $f = $this->check_dir ( $save_img );
  116. if (! $f ['flag'])
  117. {
  118. return $f;
  119. }
  120. }
  121. return $f;
  122. }
  123. }
  124. }
  125. //取得對應的方法

  126. $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );
  127. //取得原始大小

  128. $source = $org_funcs ['create_func'] ( $src_img );
  129. $src_w = imagesx ( $source );
  130. $src_h = imagesy ( $source );
  131. if (($option ['width'] && $src_w > $option ['width']) || ($option ['height'] && $src_h > $option ['height']))

  132. {
  133. if ($option ['width'] && $src_w > $option ['width'])
  134. {
  135. $widthratio = $option ['width'] / $src_ww;
  136. $resizewidth_tag = true;
  137. }
  138. if ($option ['height'] && $src_h > $option ['height'])

  139. {
  140. $ $ heightratio = $option ['height'] / $src_h;
  141. $resizeheight_tag = true;
  142. }
  143. if ($resizewidth_tag && $resizeheight_tag)

  144. {
  145. if ($widthratio $ratio = $widthratio; else $ratio = $heightratio; }
  146. if ($resizewidth_tag && ! $resizeheight_tag)

  147. $ratio = $widthratio;
  148. if ($resizeheight_tag && ! $resizewidth_tag)
  149. ; $newwidth = $src_w * $ratio;

  150. $newheight = $src_h * $ratio;
  151. if (function_exists ( "imagecopyresampled" ))

  152. {
  153. $new🎜> $newim = imagecreatetruecolor ( $newwidth, $newheight );
  154. imagecopyresampled ( $newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $src_h );
  155. $newim = imagecreate ( $newwidth, $newheight );
  156. imagecopyresized ( $newim, $source, 0, 0, 0 , 0, $newwidth, $newheight, $src_w, $src_h ); }
  157. // 輸出(儲存)圖片
  158. if (!empty ( $save_img ))
  159. {
  160. $org_funcs ['save_func'] ( $ newim, $save_img );

  161. } else
  162. {
  163. header ( $org_funcs ['header'] );
  164. $org_funcs ['save_func'] ( $newim );
  165. }
  166. imagedestroy ( $newim );
  167. return array ('flag' => True, 'msg' => '' );
  168. }
  169. /**

  170. *
  171. * 產生浮水印圖片
  172. * @param $org_img 原始圖像
  173. * @param $mark_img 水印標記圖像
  174. * @param $save_img 當其目錄不存在時,會試著建立目錄
  175. * @param array $option 為水印的一些基本設定包含:
  176. * x:水印的水平位置,預設為減去水印圖寬度後的值
  177. * y:水印的垂直位置,預設為減去水印圖高度後的值
  178. * alpha:alpha值(控制透明度),預設為50
  179. * /
  180. public function water_mark($org_img, $mark_img, $save_img = '', $option = array())
  181. {
  182. //檢查圖片
  183. $org_ext = $this->is_img ( $org_img );
  184. if (! $org_ext ['flag'])
  185. {
  186. return $org_ext;
  187. }
  188. $mark_ext = $this- >is_img ( $mark_img );
  189. 如果(! $mark_ext ['flag'])
  190. {
  191. return $mark_ext;
  192. }
  193. // 如果有路徑保存,則確定路徑是否正確
  194. if (!empty ( $save_img ))
  195. {
  196. $f = $this->check_dir ( $save_img );
  197. if (! $f ['flag'])
  198. {
  199. 回傳$f;
  200. }
  201. }
  202. //取得回覆部分

  203. $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );
  204. $org_img_im = $org_funcs ['create_funcs ['create_func '] ( $org_img );
  205. $mark_funcs = $this->get_img_funcs ( $mark_ext ['msg'] );

  206. $mark_img_im = $mark_funcs ['create_func'] ( $ mark_img );
  207. //複製浮水印圖片座標

  208. $mark_img_im_x = 0;
  209. $mark_img_im_y = 0;
  210. //複製水印圖片座標高寬
  211. $
  212. $
  213. $
  214. $
  215. $
  216. $
  217. $ mark_img_w = imagesx ( $mark_img_im );
  218. $mark_img_h = imagesy ( $mark_img_im );
  219. $org_img_w = imagesx ( $org_img_im ges; ;

  220. // 合成生成點座標

  221. $x = $org_img_w - $mark_img_w;
  222. $org_img_im_x = isset ($option ['x'] ) ? $option ['x'] : $x;
  223. $org_img_im_x = ($org_img_im_x > $org_img_w 或 $org_img_im_x $org_img_im_y = isset ($option ['y']) ? $option ['y'] : $y;
  224. $org_img_im_y = ($org_img_im_y > $org_img_h 或 $org_img_im_y
  225. // 🎜> $alpha = isset ( $option ['alpha'] ) ? $option ['alpha'] : 50;

  226. $alpha = ($alpha > 100 或 $alpha
  227. //合併圖片

  228. imagecopymerge ( $org_img_im, $mark_img_im, $org_img_im_x, $org_img_im_y, $mark_img_im_x, $marks_x, $org_img_im_y, $mark_img_im_x, $markm_x, $wm, $ );
  229. // 輸出(儲存)圖片

  230. if (!empty ( $save_img ))
  231. {
  232. $org_funcs ['save_func '] ( $org_img_im, $save_img );

  233. } else
  234. {
  235. header ( $org_funcs ['header'] );
  236. $org_funcs ['save_func'] ( $org_img_); > }
  237. // 輔導睡眠
  238. imagedestroy ( $org_img_im );
  239. imagedestroy ( $mark_img_im );
  240. return array ('flag' => True, 'msg' = > '' );
  241. }

  242. /**

  243. *
  244. * 檢查圖片
  245. * @param unknown_type $img_path
  246. * @return array('flag'=>true/false,'msg'=>ext/錯誤訊息)
  247. */
  248. 私有函數is_img($img_path)
  249. {
  250. if (! file_exists (path)
  251. {
  252. if (! file_exists ( $img_path ))
  253. {
  254. return array('flag' =>; False, 'msg' => "載入圖片$img_path失敗!" );
  255. }
  256. $ext =explode( ' .', $img_path );
  257. $ext = strtolower ( end ( $ext ) );
  258. if (! in_array ( $ext, $this->exts ))
  259. {
  260. return array (this->exts )) { return array (this->exts )) { return。 'flag' => False, 'msg' => "圖片$img_path不對格式!" );
  261. }
  262. 回傳數組('flag' => True, 'msg' => $ext );
  263. }
  264. /**

  265. *
  266. * 傳回正確的圖片函數
  267. * @param unknown_type $ext
  268. * /
  269. private function get_img_funcs($ext)
  270. {
  271. //選擇
  272. switch ($ext)
  273. {
  274. case 'jpg' :
  275. $ Type:image/jpeg';
  276. $createfunc = 'imagecreatefromjpeg';
  277. $savefunc = 'imagejpeg';
  278. 中斷;
  279. case 'jpeg' :
  280. $0header = 'Content-Typeheader = 'Content-Typeheader = 'Content-Typeheader = 'Content-Typeheader = 'Content-Typeheader = 'Content-Type :image/jpeg';
  281. $createfunc = 'imagecreatefromjpeg';
  282. $savefunc = 'imagejpeg';
  283. break;
  284. case 'gif' :
  285. $header = '內容類型:imheader = '內容類型:gif /gif';
  286. $createfunc = 'imagecreatefromgif';
  287. $savefunc = 'imagegif';
  288. 中斷;
  289. case 'bmp' :
  290. $header = '內容-Type:image/ bmp';
  291. $createfunc = 'imagecreatefrombmp';
  292. $savefunc = 'imagebmp';
  293. 中斷;
  294. 預設:
  295. $header = 'Content-Type:image /png';
  296. $createfunc = 'imagecreatefrompng';
  297. $savefunc = 'imagepng';
  298. }
  299. 傳回陣列('save_func' => $savefunc, 'create_func' => $ createf, 'header'unc' => $ createf, ' $header );
  300. }
  301. /**

  302. *
  303. * 檢查並試著建立目錄
  304. * @param $save_img
  305. */
  306. 私有函數check_dir($save_img)
  307. {
  308. $dir = 目錄名( $ save_img );
  309. if (! is_dir ( $dir ))
  310. {
  311. if (! mkdir ( $dir, 0777, true ))
  312. {
  313. return array ('flag' = False, 'msg' => "圖片儲存目錄$dir 無法建立! " );
  314. }
  315. }
  316. 回傳數組('flag' => True, 'msg' => '' );
  317. }
  318. }
  319. if (!empty ( $_FILES ['test'] ['tmp_name'] ))

  320. {
  321. //範例
  322. $img = new Img ();
  323. //原圖
  324. $name=explode('.', $_FILES['test']['name']);
  325. $org_img ='D:/test.' 。 end ( $name );
  326. move_uploaded_file ( $ $ _FILES ['test'] ['tmp_name'], $org_img );
  327. $option = array ('width' => $_POST ['width'], 'height' => $_POST ['height'] ) ;
  328. if ($_POST ['type'] == 1)
  329. {
  330. $s = $img->resize_image ( $org_img , '', $option );
  331. } else
  332. {
  333. $img->thumb_img ( $org_img, '', $option );
  334. }
  335. 取消連結( $org_img );
  336. }
複製程式碼

使用方式: php浮水印

  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. //範例

  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. $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. //儲存壓縮圖
$save_img2 = 'D:/test99h/testone/sss2_thumb.png';
$flag = $img->thumb_img ( $save_img, $ save_img2, $選項;); /等比例壓縮類似

複製程式碼



來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板