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

來源:互聯網
上載者:User
  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. * @throws Exception
  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'] ) or 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. 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. }

  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. //輸出(儲存)圖片
  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. * 產生浮水印圖片
  178. * @param $org_img 原映像
  179. * @param $mark_img 浮水印標記映像
  180. * @param $save_img 當其目錄不存在時,會試著建立目錄
  181. * @param array $option 為浮水印的一些基本設定包含:
  182. * x:浮水印的水平位置,預設為減去浮水印圖寬度後的值
  183. * y:浮水印的垂直位置,預設為減去浮水印圖高度後的值
  184. * alpha:alpha值(控制透明度),預設為50
  185. */
  186. public function water_mark($org_img, $mark_img, $save_img = '', $option = array())
  187. {
  188. //檢查圖片
  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. //如果有儲存路徑,則確定路徑是否正確
  200. if (! empty ( $save_img ))
  201. {
  202. $f = $this->check_dir ( $save_img );
  203. if (! $f ['flag'])
  204. {
  205. return $f;
  206. }
  207. }

  208. //擷取相應畫布

  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. //拷貝浮水印圖片座標

  214. $mark_img_im_x = 0;
  215. $mark_img_im_y = 0;
  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 );

  220. $org_img_h = imagesx ( $org_img_im );

  221. //合成產生點座標

  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. //合并圖片

  232. imagecopymerge ( $org_img_im, $mark_img_im, $org_img_im_x, $org_img_im_y, $mark_img_im_x, $mark_img_im_y, $mark_img_w, $mark_img_h, $alpha );

  233. //輸出(儲存)圖片

  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. //銷毀畫布
  243. imagedestroy ( $org_img_im );
  244. imagedestroy ( $mark_img_im );
  245. return array ('flag' => True, 'msg' => '' );

  246. }

  247. /**

  248. *
  249. * 檢查圖片
  250. * @param unknown_type $img_path
  251. * @return array('flag'=>true/false,'msg'=>ext/錯誤資訊)
  252. */
  253. private function is_img($img_path)
  254. {
  255. if (! file_exists ( $img_path ))
  256. {
  257. return array ('flag' => False, 'msg' => "載入圖片 $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' => "圖片 $img_path 格式不正確!" );
  264. }
  265. return array ('flag' => True, 'msg' => $ext );
  266. }

  267. /**

  268. *
  269. * 返回正確的圖片函數
  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. * 檢查並試著建立目錄
  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. }

複製代碼

使用方式: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. //儲存壓縮圖
  15. $save_img2 = 'D:/test99h/testone/sss2_thumb.png';
  16. $flag = $img->thumb_img ( $save_img, $save_img2, $option ); //等比例壓縮類似
複製代碼

在壓縮產生的浮水印映像時,壓縮後產生的映像格式應與原映像,浮水印映像一致。不然,會出現一些未知錯誤。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.