PHP サムネイルおよび画像透かしクラス (画像サイズの比例スケーリング)

WBOY
リリース: 2016-07-25 08:51:35
オリジナル
1049 人が閲覧しました
  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. 新しい例外をスローします (「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. パブリック関数thumb_img($src_img, $save_img = '', $option)
  34. {

  35. if (空 ( $option ['width'] ) または空 ( $option ['height'] ))

  36. {
  37. return array ('flag' => False, 'msg' => 'Original画像の長さと幅は 0' より小さくすることはできません' );
  38. }
  39. $org_ext = $this->is_img ( $src_img );
  40. if (! $org_ext ['flag'])
  41. {
  42. return $org_ext ;
  43. }< /p>
  44. //保存パスがある場合は、そのパスが正しいかどうかを判断します

  45. if (! empty ( $save_img ))
  46. {
  47. $f = $this->check_dir ( $save_img );
  48. if ( ! $f ['flag'])
  49. {
  50. return $f;
  51. }
  52. }

  53. // 対応するメソッドを取得します

  54. $org_funcs = $this ->get_img_funcs ( $org_ext ['msg'] );

  55. //元のサイズを取得します

  56. $source = $org_funcs ['create_func'] ( $src_img );
  57. $src_w = imagex ( $source );
  58. $ src_h = imagey ( $source );

  59. //元の画像を調整します (画像の元の形状を維持し、画像をトリミングします)

  60. $dst_scale = $ option ['height'] / $option ['width'] ; // ターゲット画像のアスペクト比
  61. $src_scale = $src_h / $src_w; // 元の画像のアスペクト比
  62. if ($src_scale >= $dst_scale) { // 高すぎます
  63. $w = intval ( $src_w );
  64. $h = intval ( $dst_scale * $w );

  65. $x = 0;

  66. $y = ($src_h - $h) / 3;
  67. } else
  68. { / / 幅が広すぎます
  69. $h = intval ( $src_h );
  70. $w = intval ( $h / $dst_scale );

  71. = ($src_w - $w) / 2;

  72. $y = 0;
  73. }
  74. // トリミング
  75. $croped = imagecreatetruecolor ( $w, $h );
  76. imagecopy ( $croped, $source, 0, 0, $ x, $y, $src_w, $src_h );
  77. // スケーリング
  78. $scale = $option ['width'] / $w;
  79. $target = imagecreatetruecolor ( $option ['width'], $option ['height '] );
  80. $final_w = intval ( $w * $scale );
  81. $final_h = intval ( $h * $scale );
  82. imagecopyresampled ( $target, $croped, 0, 0, 0, 0, $final_w, $final_h, $w, $h );
  83. imagedestroy ( $croped );

  84. //画像を出力(保存)

  85. if (! empty ( $save_img ))
  86. {

    ;
  87. $org_funcs ['save_func' ] ( $target, $save_img );

  88. } else
  89. {
  90. header ( $org_funcs ['header'] );
  91. $org_funcs ['save_func'] ( $target ) ;
  92. }
  93. imagedestroy ( $target );
  94. return array ('flag' => True, 'msg' => '' );
  95. }

  96. *
  97. * 拡大縮小画像
  98. * @param $src_img 元画像
  99. * @param $save_img 保存先
  100. * @param $option パラメータ設定 array('width'=>xx,'height'=> xxx)
  101. *
  102. */
  103. function raise_image($src_img, $save_img = '', $option)
  104. {
  105. $org_ext = $this->is_img ( $src_img );
  106. if (! $org_ext ['flag'])
  107. {
  108. return $org_ext;
  109. }

  110. //保存パスがある場合、そのパスが正しいかどうかを判定します

  111. if (! empty ( $save_img ))
  112. {
  113. $f = $this- >check_dir ( $save_img );
  114. if (! $f [ 'flag'])
  115. {
  116. return $f;
  117. }
  118. }

  119. // 対応するメソッドを取得します

  120. $org_funcs = $this->get_img_funcs ( $org_ext ['msg' ] );

  121. //元のサイズを取得します

  122. $source = $org_funcs ['create_func'] ( $src_img );
  123. $src_w = imagex ( $source );
  124. $src_h = imagey ( $source );

  125. if (($option ['width'] && $src_w > $option ['width' ]) || ($option ['高さ'] && $src_h > $option ['高さ']))

  126. {
  127. if ($option ['幅'] && $src_w > $option ['幅'] )
  128. {
  129. $widthratio = $option ['width'] / $src_w;
  130. $resizewidth_tag = true;
  131. }

  132. if ($option ['height'] && $src_h > $option ['height'])

  133. {
  134. $heightratio = $option ['height'] / $src_h;
  135. $resizeheight_tag = true;
  136. }

  137. if ($resizewidth_tag && $resizeheight_tag )

  138. {
  139. if ($widthratio $ rate = $widthratio;
  140. else
  141. $ratio = $heightratio;
  142. }

  143. if ($resizewidth_tag && ! $resizeheight_tag)

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

  147. $newwidth = $src_w * $ratio;

  148. $newheight = $src_h * $ratio;

  149. if (function_exists ( "imagecopyresampled" ))

  150. {
  151. $newim = imagecreatetruecolor ( $newwidth, $newheight );
  152. imagecopyresampled ( $newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $src_h );
  153. } else
  154. {
  155. $newim = imagecreate ( $newwidth, $newheight );
  156. imagecopyresize ( $newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $src_h );
  157. }
  158. }
  159. //出(保存)图片
  160. if (! empty ( $save_img ))
  161. {

  162. $org_funcs ['save_func'] ( $newim, $save_img );

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

  171. /**

  172. *
  173. * 透かし画像を生成します
  174. * @param $org_img 元の画像
  175. * @param $mark_img 透かし画像
  176. * @param $save_img ディレクトリが存在しない場合、ディレクトリの作成を試みます
  177. * @param array $optionウォーターマークの基本設定には以下が含まれます:
  178. * x: ウォーターマークの水平位置、デフォルトはウォーターマーク画像の幅を引いた後の値です
  179. * y: ウォーターマークの垂直位置、デフォルトは後の値です透かし画像の高さを減算します
  180. * alpha: アルファ値 (透明度の制御)、デフォルトは 50 です
  181. */
  182. public function Water_mark($org_img, $mark_img, $save_img = '', $option = array())
  183. {
  184. //检查图片
  185. $org_ext = $this->is_img ( $org_img );
  186. if (! $org_ext ['flag'])
  187. {
  188. return $org_ext;
  189. }
  190. $mark_ext = $this->is_img ( $mark_img );
  191. if (! $mark_ext ['flag' ])
  192. {
  193. return $mark_ext;
  194. }
  195. //如果有保存路径,则确定路径有無正确
  196. if (! empty ( $save_img ))
  197. {
  198. $f = $this->check_dir ( $save_img ) ;
  199. if (! $f ['flag'])
  200. {
  201. return $f;
  202. }
  203. }

  204. //获取相应画布

  205. $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );
  206. $org_img_im = $org_funcs ['create_func'] ( $org_img );

  207. get_img_funcs ( $mark_ext ['msg'] );
  208. $mark_img_im = $mark_funcs ['create_func'] ( $mark_img );

  209. //贝水印图片座標

  210. $mark_img_im_x = 0;
  211. $mark_img_im_y = 0;
  212. //贝水印图片高宽
  213. $mark_img_w = imagex ( $mark_img_im );
  214. $mark_img_h = imagey ( $mark_img_im );< /p> ;
  215. $org_img_w = 画像x ( $org_img_im );

  216. $org_img_h = 画像x ( $org_img_im );

  217. //合成生成点坐标

  218. $x = $org_img_w - $mark_img_w;
  219. $org_img_im_x = isset ( $option ['x'] ) ? $option ['x'] : $x;
  220. $org_img_im_x = ($org_img_im_x > $org_img_w または $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_y = ($org_img_im_y > $org_img_h または $org_img_im_y

    //アルファ

  223. $alpha = isset ( $option ['alpha'] ) ? $option ['alpha'] : 50;
  224. $alpha = ($alpha > 100 または $alpha
  225. //結合图片

  226. 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 );

  227. //输出(保存)写真

  228. if (! empty ( $save_img ))
  229. {

  230. $org_funcs ['save_func'] ( $org_img_im, $save_img );

  231. } else
  232. {
  233. header ( $org_funcs ['header'] );
  234. $org_funcs ['save_func'] ( $org_img_im );
  235. }
  236. //销毁画布
  237. imagedestroy ( $org_img_im );
  238. imagedestroy ( $mark_img_im );
  239. return array ('flag' => True, 'msg' => '' );

  240. }

  241. /**

  242. *
  243. * 画像を確認してください
  244. * @paramknown_type $img_path
  245. * @return array('flag'=>true/false,'msg'=>ext/error message)
  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 = strto lower ( end ( $ext ) );
  255. if (! in_array ( $ext, $this-> ;exts ))
  256. {
  257. return array ('flag' => False, 'msg' => "图片 $img_path 格式不正确!" );
  258. }
  259. return array ('flag' => True, 'msg' => $ext );
  260. }

  261. /**

  262. *
  263. * 正しい画像関数を返します
  264. * @paramknown_type $ext
  265. */
  266. プライベート関数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. break;
  276. case 'jpeg' :
  277. $header = 'Content-Type:image/jpeg';
  278. $createfunc = 'imagecreatefromjpeg';
  279. $savefunc = 'imagejpeg';
  280. break;
  281. case ' gif' :
  282. $header = 'Content-Type:image/gif';
  283. $createfunc = 'imagecreatefromgif';
  284. $savefunc = 'imagegif';
  285. Break;
  286. case 'bmp' :
  287. $header = 'Content-Type :image/bmp';
  288. $createfunc = 'imagecreatefrombmp';
  289. $savefunc = 'imagebmp';
  290. ブレーク;
  291. デフォルト :
  292. $header = 'Content-Type:image/png';
  293. $createfunc = 'imagecreatefrompng';
  294. $savefunc = 'imagepng';
  295. }
  296. return array ('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 = dirname ( $save_img );
  306. if (! is_dir ( $dir ))
  307. {
  308. if (! mkdir ( $dir, 0777, true ))
  309. {
  310. return array ('flag' => False, 'msg' => "图片保存目录 $dir 無法创建!" );
  311. }
  312. }
  313. return array ('flag' => True, 'msg' => '' );
  314. }
  315. }

  316. if (! empty ( $ _FILES ['test'] ['tmp_name'] ))

  317. {
  318. //例子
  319. $img = new Img ();
  320. //原图
  321. $name =explode ( '.', $_FILES ['test'] ['名前'] );
  322. $org_img = 'D:/test.' 。 end ( $name );
  323. move_uploaded_file ( $_FILES ['test'] ['tmp_name'], $org_img );
  324. $option = array ('width' => $_POST ['width'], 'height' = > $_POST ['高さ'] );
  325. if ($_POST ['タイプ'] == 1)
  326. {
  327. $s = $img->resize_image ( $org_img, '', $option );
  328. } else
  329. {
  330. $img->thumb_img ( $org_img, '', $option );
  331. }
  332. unlink ( $org_img );
  333. }

复制コード

使用方法: 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 );
复制番号

调节$オプションの大小:

  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. $option $img->water_mark ( $org_img, $mark_img, $save_img, $option ) = array ('width' => 200, 'height' => 200 );
  12. //保存压缩图
  13. $save_img2 = 'D:/test99h/testone/sss2_thumb.png';
  14. $flag = $img- >thumb_img ( $save_img, $save_img2, $option ); //等比例圧縮形式
  15. 倍生成符号
圧縮生成された水印画像の際、圧縮後に生成された画像形式は原画像と一致し、水印画像は一致する。 しかし、いくつかの未知の危険な発言が発生する可能性があります。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート