ホームページ  >  記事  >  バックエンド開発  >  PHP画像処理関数クラス(ウォーターマーク、サムネイル) 【比例圧縮とクロップ圧縮について】

PHP画像処理関数クラス(ウォーターマーク、サムネイル) 【比例圧縮とクロップ圧縮について】

WBOY
WBOYオリジナル
2016-07-25 08:44:29954ブラウズ
以下は、透かし、サムネイルなどの機能を含む単純な画像処理クラスです。
ただし、サムネイルを生成するには 2 つの方法があります。1 つは画像を比例的に直接圧縮する方法、もう 1 つは画像をトリミングしてから圧縮する方法です。私の考えでは、大文字と小文字を区別する圧縮とトリミング圧縮の違いは次のとおりです。
均等なサンプル圧縮: 画像の幅と長さの比率が適切で、画像が完全であることを保証できます。ただし、実際のサイズが要件を満たすことは保証されません。
トリミングと圧縮: 画像の幅と長さの比率が適切であることを保証し、実際のサイズも保証できます。ただし、画像の完全性は保証できません。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. * @throws 例外
  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 width $maxheight height
  29. * array('width'=> xx ,'height'=>xxx)
  30. * @internal
  31. * 画像が長すぎるか幅が広すぎる場合、生成される画像
  32. * このため、最初にトリミングしてからプロポーショナルを実行します。圧縮方法
  33. */
  34. public functionthumb_img($src_img, $save_img = '', $option)
  35. {
  36. if (empty ( $option ['width'] )または空 ( $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 = imagex ( $source );
  59. $src_h = imagey ( $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 * $スケール );
  83. $final_h = intval ( $h * $scale );
  84. imagecopyresampled ( $target, $croped, 0, 0, 0, 0, $final_w, $final_h, $w, $h );
  85. imagedestroy ( $切り抜き );
  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 raise_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 = imagex ( $source );
  127. $src_h = imagey ( $source );
  128. if (($option [ 'width'] && $src_w > $option ['width']) || ($option ['height'] && $src_h > $option [ '高さ']))
  129. {
  130. if ($option [' width'] && $src_w > $option ['width'])
  131. {
  132. $widthratio = $option ['width'] / $src_w;
  133. $ sizewidth_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. imagecopyresize ( $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: アルファ値 (透明度の制御)、デフォルトは 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 = images ( $mark_img_im );
  219. $org_img_w = imagesx ( $org_img_im );
  220. $org_img_h = imagex ( $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_w または $org_img_im_x $y = $org_img_h - $mark_img_h;
  225. $org_img_im_y = isset ( $option ['y'] ) $option ['y'] : $y;
  226. $org_img_im_y = ($org_img_im_y > $ org_img_h または $org_img_im_y //alpha
  227. $alpha = isset ( $option ['alpha'] ) : 50;
  228. $alpha = ( $ alpha&gt; mark_img_h, $ alpha);
  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_im );
  237. }
  238. // キャンバスを破棄
  239. imagedestroy ( $org_img_im );
  240. imagedestroy ( $mark_img_im );
  241. return array ( 'flag' => True、'msg' = > '' );
  242. }
  243. /**
  244. *
  245. * 画像を確認してください
  246. * @paramknown_type $img_path
  247. * @return array('flag'=>true/false,'msg'=>ext/error message)
  248. */
  249. プライベート関数 is_img($img_path)
  250. {
  251. if (! file_exists ( $img_path ) )
  252. {
  253. return array ('flag' => ; False, 'msg' => "画像 $img_path の読み込みに失敗しました! " );
  254. }
  255. $ext =explode ( '.', $img_path );
  256. $ext = strto lower ( end ( $ext ) );
  257. if (! in_array ( $ext, $this->exts ))
  258. {
  259. return array ('flag' => False, 'msg' => "画像 $img_path の形式が正しくありません!" );
  260. }
  261. return array ('flag' => True, 'msg' => $ext );
  262. }
  263. /**
  264. *
  265. * 正しい画像関数を返します
  266. * @paramknown_type $ext
  267. */
  268. プライベート関数 get_img_funcs($ext)
  269. {
  270. //选择
  271. switch ($ext)
  272. {
  273. case 'jpg' :
  274. $header = 'Content-Type:image/jpeg';
  275. $createfunc = 'imagecreatefromjpeg';
  276. $savefunc = 'imagejpeg';
  277. Break;
  278. case 'jpeg' :
  279. $header = 'Content-Type:image/jpeg';
  280. $createfunc = 'imagecreatefromjpeg';
  281. $savefunc = 'imagejpeg';
  282. Break;
  283. case 'gif' :
  284. $header = ' Content-Type:image/gif';
  285. $createfunc = 'imagecreatefromgif';
  286. $savefunc = 'imagegif';
  287. Break;
  288. case 'bmp' :
  289. $header = 'Content-Type:image/bmp';
  290. $ createfunc = 'imagecreatefrombmp';
  291. $savefunc = 'imagebmp';
  292. ブレーク;
  293. デフォルト :
  294. $header = 'Content-Type:image/png';
  295. $createfunc = 'imagecreatefrompng';
  296. $savefunc = 'imagepng';
  297. }
  298. return array ('save_func' => $savefunc, 'create_func' => $createfunc, 'header' => $header );
  299. }
  300. /**
  301. *
  302. * ディレクトリを確認して作成してみます
  303. * @param $save_img
  304. */
  305. プライベート関数 check_dir ($save_img)
  306. {
  307. $dir = dirname ( $save_img );
  308. if (! is_dir ( $dir ))
  309. {
  310. if (! mkdir ( $dir, 0777, true ))
  311. {
  312. return array ('flag' => False, 'msg' => "图片保存目录 $dir 無法创建!" );
  313. }
  314. }
  315. return array ('flag' => True, 'msg' => '' );
  316. }
  317. }
  318. if (! empty ( $_FILES ['test'] [' tmp_name'] ))
  319. {
  320. //例子
  321. $img = new Img ();
  322. //原图
  323. $name =explode ( '.', $_FILES ['test'] ['name'] );
  324. $org_img = 'D:/テスト。' 。 end ( $name );
  325. move_uploaded_file ( $_FILES ['test'] ['tmp_name'], $org_img );
  326. $option = array ('width' => $_POST ['width'], 'height' = > $_POST ['高さ'] );
  327. if ($_POST ['タイプ'] == 1)
  328. {
  329. $s = $img->resize_image ( $org_img, '', $option );
  330. } else
  331. {
  332. $img->thumb_img ( $org_img, '', $option );
  333. }
  334. unlink ( $org_img );
  335. }
复制代

使用方法:

水印
  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. $img = new Img ();
  2. $org_img = 'D:/tt.png';
  3. //压缩图片(100*100)
  4. $option = array ('width' = > 100, 'height' => 100 );
  5. //$save_img は空時、将会直接出输览器
  6. $save_img = 'D:/test99h/testone/sss_thumb.png';
  7. $flag = $img->thumb_img ( $org_img, $save_img, $option );
复制代码
调节$オプションの大きさ:

    $option = array ('width' => 200, 'height' => 200);
复制代
水印与压缩图

    $img = new Img ();
  1. //原图
  2. $org_img = 'D:/tt.png';
  3. //水印标记图
  4. $mark_img = 'D:/t.png';
  5. //保存水印图片
  6. $save_img = 'D:/test99h/testone/sss.png';
  7. //水印设置调节
  8. $option = array ('x' => 50, 'y' => 50 , 'alpha' => 60 );
  9. //生成水印图片
  10. $flag = $img->water_mark ( $org_img, $mark_img, $save_img, $option );
  11. //压缩水印图片
  12. $option = array ('width' => 200, 'height' => 200 );
  13. //保存压缩图
  14. $save_img2 = 'D:/test99h/testone/sss2_thumb.png';
  15. $flag = $img-> ;thumb_img ( $save_img, $save_img2, $option ); //等比压缩类似
复制代
生成された透かし画像を圧縮する場合、圧縮後に生成される画像の形式は、元の画像および透かし画像と一致する必要があります。そうしないと、不明なエラーが発生します。

さらに注意してください: 画像圧縮の原理は私が発明したものではありません。
画像処理、プロポーショナル、PHP


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。