Rumah pembangunan bahagian belakang tutorial php php缩略图与图片水印类(等比缩放图片大小)

php缩略图与图片水印类(等比缩放图片大小)

Jul 25, 2016 am 08:51 AM

  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 $ratio = $widthratio;
  143. else
  144. $ratio = $heightratio;
  145. }
  146. if ($resizewidth_tag && ! $resizeheight_tag)

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

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

  153. {
  154. $newim = imagecreatetruecolor ( $newwidth, $newheight );
  155. imagecopyresampled ( $newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $src_h );
  156. } else
  157. {
  158. $newim = imagecreate ( $newwidth, $newheight );
  159. imagecopyresized ( $newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $src_h );
  160. }
  161. }
  162. //输出(保存)图片
  163. if (! empty ( $save_img ))
  164. {
  165. $org_funcs ['save_func'] ( $newim, $save_img );

  166. } else
  167. {
  168. header ( $org_funcs ['header'] );
  169. $org_funcs ['save_func'] ( $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 );
  210. $mark_funcs = $this->get_img_funcs ( $mark_ext ['msg'] );

  211. $mark_img_im = $mark_funcs ['create_func'] ( $mark_img );
  212. //拷贝水印图片坐标

  213. $mark_img_im_x = 0;
  214. $mark_img_im_y = 0;
  215. //拷贝水印图片高宽
  216. $mark_img_w = imagesx ( $mark_img_im );
  217. $mark_img_h = imagesy ( $mark_img_im );
  218. $org_img_w = imagesx ( $org_img_im );

  219. $org_img_h = imagesx ( $org_img_im );
  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 or $org_img_im_x $y = $org_img_h - $mark_img_h;
  224. $org_img_im_y = isset ( $option ['y'] ) ? $option ['y'] : $y;
  225. $org_img_im_y = ($org_img_im_y > $org_img_h or $org_img_im_y
  226. //alpha

  227. $alpha = isset ( $option ['alpha'] ) ? $option ['alpha'] : 50;
  228. $alpha = ($alpha > 100 or $alpha
  229. //合并图片

  230. 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 );
  231. //输出(保存)图片

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

  235. } else
  236. {
  237. header ( $org_funcs ['header'] );
  238. $org_funcs ['save_func'] ( $org_img_im );
  239. }
  240. //销毁画布
  241. imagedestroy ( $org_img_im );
  242. imagedestroy ( $mark_img_im );
  243. return array ('flag' => True, 'msg' => '' );
  244. }

  245. /**

  246. *
  247. * 检查图片
  248. * @param unknown_type $img_path
  249. * @return array('flag'=>true/false,'msg'=>ext/错误信息)
  250. */
  251. private function is_img($img_path)
  252. {
  253. if (! file_exists ( $img_path ))
  254. {
  255. return array ('flag' => False, 'msg' => "加载图片 $img_path 失败!" );
  256. }
  257. $ext = explode ( '.', $img_path );
  258. $ext = strtolower ( end ( $ext ) );
  259. if (! in_array ( $ext, $this->exts ))
  260. {
  261. return array ('flag' => False, 'msg' => "图片 $img_path 格式不正确!" );
  262. }
  263. return array ('flag' => True, 'msg' => $ext );
  264. }
  265. /**

  266. *
  267. * 返回正确的图片函数
  268. * @param unknown_type $ext
  269. */
  270. private function get_img_funcs($ext)
  271. {
  272. //选择
  273. switch ($ext)
  274. {
  275. case 'jpg' :
  276. $header = 'Content-Type:image/jpeg';
  277. $createfunc = 'imagecreatefromjpeg';
  278. $savefunc = 'imagejpeg';
  279. break;
  280. case 'jpeg' :
  281. $header = 'Content-Type:image/jpeg';
  282. $createfunc = 'imagecreatefromjpeg';
  283. $savefunc = 'imagejpeg';
  284. break;
  285. case 'gif' :
  286. $header = 'Content-Type:image/gif';
  287. $createfunc = 'imagecreatefromgif';
  288. $savefunc = 'imagegif';
  289. break;
  290. case 'bmp' :
  291. $header = 'Content-Type:image/bmp';
  292. $createfunc = 'imagecreatefrombmp';
  293. $savefunc = 'imagebmp';
  294. break;
  295. default :
  296. $header = 'Content-Type:image/png';
  297. $createfunc = 'imagecreatefrompng';
  298. $savefunc = 'imagepng';
  299. }
  300. return array ('save_func' => $savefunc, 'create_func' => $createfunc, 'header' => $header );
  301. }
  302. /**

  303. *
  304. * 检查并试着创建目录
  305. * @param $save_img
  306. */
  307. private function check_dir($save_img)
  308. {
  309. $dir = dirname ( $save_img );
  310. if (! is_dir ( $dir ))
  311. {
  312. if (! mkdir ( $dir, 0777, true ))
  313. {
  314. return array ('flag' => False, 'msg' => "图片保存目录 $dir 无法创建!" );
  315. }
  316. }
  317. return array ('flag' => True, 'msg' => '' );
  318. }
  319. }
  320. if (! empty ( $_FILES ['test'] ['tmp_name'] ))

  321. {
  322. //例子
  323. $img = new Img ();
  324. //原图
  325. $name = explode ( '.', $_FILES ['test'] ['name'] );
  326. $org_img = 'D:/test.' . end ( $name );
  327. move_uploaded_file ( $_FILES ['test'] ['tmp_name'], $org_img );
  328. $option = array ('width' => $_POST ['width'], 'height' => $_POST ['height'] );
  329. if ($_POST ['type'] == 1)
  330. {
  331. $s = $img->resize_image ( $org_img, '', $option );
  332. } else
  333. {
  334. $img->thumb_img ( $org_img, '', $option );
  335. }
  336. unlink ( $org_img );
  337. }
复制代码

使用方式: 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 ); //等比例压缩类似
复制代码

在压缩生成的水印图像时,压缩后生成的图像格式应与原图像,水印图像一致。 不然,会出现一些未知错误。



Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Apr 05, 2025 am 12:04 AM

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Terangkan konsep pengikatan statik lewat dalam PHP. Terangkan konsep pengikatan statik lewat dalam PHP. Mar 21, 2025 pm 01:33 PM

Artikel membincangkan pengikatan statik lewat (LSB) dalam PHP, yang diperkenalkan dalam Php 5.3, yang membolehkan resolusi runtime kaedah statik memerlukan lebih banyak warisan yang fleksibel. Isu: LSB vs polimorfisme tradisional; Aplikasi Praktikal LSB dan Potensi Perfo

Ciri -ciri Keselamatan Rangka Kerja: Melindungi Kelemahan. Ciri -ciri Keselamatan Rangka Kerja: Melindungi Kelemahan. Mar 28, 2025 pm 05:11 PM

Artikel membincangkan ciri -ciri keselamatan penting dalam rangka kerja untuk melindungi daripada kelemahan, termasuk pengesahan input, pengesahan, dan kemas kini tetap.

Menyesuaikan/Memperluas Rangka Kerja: Cara Menambah Fungsi Custom. Menyesuaikan/Memperluas Rangka Kerja: Cara Menambah Fungsi Custom. Mar 28, 2025 pm 05:12 PM

Artikel ini membincangkan menambah fungsi khusus kepada kerangka kerja, memberi tumpuan kepada pemahaman seni bina, mengenal pasti titik lanjutan, dan amalan terbaik untuk integrasi dan debugging.

Bagaimana cara menghantar permintaan pos yang mengandungi data JSON menggunakan perpustakaan php curl? Bagaimana cara menghantar permintaan pos yang mengandungi data JSON menggunakan perpustakaan php curl? Apr 01, 2025 pm 03:12 PM

Menghantar data JSON menggunakan perpustakaan Curl PHP dalam pembangunan PHP, sering kali perlu berinteraksi dengan API luaran. Salah satu cara biasa ialah menggunakan perpustakaan curl untuk menghantar post ...

Huraikan prinsip -prinsip yang kukuh dan bagaimana ia memohon kepada pembangunan PHP. Huraikan prinsip -prinsip yang kukuh dan bagaimana ia memohon kepada pembangunan PHP. Apr 03, 2025 am 12:04 AM

Penerapan prinsip pepejal dalam pembangunan PHP termasuk: 1. Prinsip Tanggungjawab Tunggal (SRP): Setiap kelas bertanggungjawab untuk hanya satu fungsi. 2. Prinsip Terbuka dan Tutup (OCP): Perubahan dicapai melalui lanjutan dan bukannya pengubahsuaian. 3. Prinsip Penggantian Lisch (LSP): Subkelas boleh menggantikan kelas asas tanpa menjejaskan ketepatan program. 4. Prinsip Pengasingan Antara Muka (ISP): Gunakan antara muka halus untuk mengelakkan kebergantungan dan kaedah yang tidak digunakan. 5. Prinsip Inversi Ketergantungan (DIP): Modul peringkat tinggi dan rendah bergantung kepada abstraksi dan dilaksanakan melalui suntikan ketergantungan.

Bagaimanakah sesi merampas kerja dan bagaimana anda dapat mengurangkannya dalam PHP? Bagaimanakah sesi merampas kerja dan bagaimana anda dapat mengurangkannya dalam PHP? Apr 06, 2025 am 12:02 AM

Sesi rampasan boleh dicapai melalui langkah -langkah berikut: 1. Dapatkan ID Sesi, 2. Gunakan ID Sesi, 3. Simpan sesi aktif. Kaedah untuk mengelakkan rampasan sesi dalam PHP termasuk: 1. Gunakan fungsi Sesi_Regenerate_ID () untuk menjana semula ID Sesi, 2. Data sesi stor melalui pangkalan data, 3.

See all articles