0

0

图片缩放水印PHP类

php中文网

php中文网

发布时间:2016-07-25 08:46:08

|

1223人浏览过

|

来源于php中文网

原创

  1. /**
  2. * 图片缩放水印类
  3. *
  4. */
  5. class cls_photo
  6. {
  7. protected $waterrate = 0.2; //水印图标在图片上的比例
  8. protected $width = 300; //缩略图默认宽度
  9. protected $height = 200; //缩略图默认高度
  10. protected $padding = 5; //水印图到边的距离
  11. protected $water_mark = "./water.png";
  12. protected $water_mark_pos = 5;//水印图片位置(1=左上角,2=右上角,3=左下角,4=右下角,5中央)
  13. protected $watermode = 0;// 0缩略图时不打水印 1缩略图时打水印
  14. protected $magick_handle;//图片操作句柄
  15. protected $format = array ( 'jpg','gif','png','jpeg' ); // 图片文件格式限定
  16. protected $smallpic_mode = 2;//默认模式 0为不生成缩略图, 1为裁切缩放 ,2为比例缩放 3为缩放填充模式
  17. /**
  18. * 设置图片类参数
  19. *
  20. * @param $arg 图片参数 多次可放入数组里 如下
  21. * @param $protected 参数值
  22. * array(
  23. * 'waterrate'=>0.2,
  24. * 'water_mark'=>'./water.png',
  25. * 'water_mark_pos'=>4,
  26. * 'smallpic_mode'=>1
  27. * );
  28. * @return ture/false
  29. */
  30. public function set_args ( $arg,$val="" )
  31. {
  32. $params = array ( 'waterrate','water_mark','water_mark_pos','smallpic_mode','watermode','width','height' );
  33. if ( is_array ( $arg ) )
  34. {
  35. foreach ( $arg as $k =>$v )
  36. {
  37. if ( in_array ( $k,$params ) )
  38. {
  39. $this->$k = $v;
  40. }
  41. }
  42. }
  43. else
  44. {
  45. if ( empty ( $val ) )
  46. {
  47. return false;
  48. }
  49. else
  50. {
  51. if ( in_array ( $arg,$params ) )
  52. {
  53. $this->$arg = $val;
  54. }
  55. }
  56. }
  57. return true;
  58. }
  59. /**
  60. * 图片缩放
  61. *
  62. * @param $src_file 源文件路径
  63. * @param $dst_file 目标文件路径
  64. * @return 缩略图片路径/false
  65. */
  66. public function scale ( $src_file,$dst_file="" )
  67. {
  68. $dst_width = $this->width;
  69. $dst_height = $this->height;
  70. $mode = $this->smallpic_mode;
  71. $magic_water_handle = NewMagickWand();
  72. if ( !MagickReadImage ( $magic_water_handle, $src_file ) ) return false;
  73. //类型
  74. $srcext = strtolower ( MagickGetImageFormat ( $magic_water_handle ) );
  75. if ( $srcext=='bmp' )
  76. {
  77. $srcext = 'jpeg';
  78. }
  79. if ( !in_array ( $srcext,$this->format ) ) return false;
  80. //尺寸
  81. $src_width = MagickGetImageWidth ( $magic_water_handle );
  82. $src_height = MagickGetImageHeight ( $magic_water_handle );
  83. //裁切缩放模式
  84. if ( $mode == 1 )
  85. {
  86. $pos_x=$pos_y = 0;//裁切临时位置
  87. $src_widthc = $src_width;//裁切临时宽度
  88. $src_heightc = $src_height;//裁切临时高度
  89. if ( $src_width/$src_height>$dst_width/$dst_height )
  90. {
  91. $src_widthc = $src_height*$dst_width/$dst_height;
  92. $pos_x = ( $src_width-$src_widthc ) /2;
  93. }
  94. else
  95. {
  96. $src_heightc = $src_width*$dst_height/$dst_width;
  97. $pos_y = ( $src_height-$src_heightc ) /2;
  98. }
  99. MagickCropImage ( $magic_water_handle,$src_widthc,$src_heightc,$pos_x,$pos_y );//裁切
  100. //因为MagickCropImage函数后,Gif 图像改,但画布不变
  101. $this->magick_handle = NewMagickWand();
  102. MagickNewImage ( $this->magick_handle,$src_widthc,$src_heightc,'#ffffff' );
  103. MagickSetFormat ( $this->magick_handle,$srcext );
  104. MagickCompositeImage ( $this->magick_handle,$magic_water_handle,MW_OverCompositeOp,0,0 );
  105. //缩放
  106. MagickScaleImage ( $this->magick_handle, $dst_width, $dst_height );
  107. }
  108. //比例缩放模式
  109. if ( $mode == 2 )
  110. {
  111. if ( $src_width/$src_height>$dst_width/$dst_height )
  112. {
  113. $dst_height=$dst_width*$src_height/$src_width;
  114. }
  115. else
  116. {
  117. $dst_width=$dst_height*$src_width/$src_height;
  118. }
  119. $this->magick_handle=$magic_water_handle;//替换
  120. MagickScaleImage ( $this->magick_handle, $dst_width, $dst_height );//缩放
  121. }
  122. //缩放填充模式
  123. if ( $mode == 3 )
  124. {
  125. if ( $src_width/$src_height>$dst_width/$dst_height )
  126. {
  127. $dst_heightc=$dst_width*$src_height/$src_width;
  128. $dst_widthc=$dst_width;
  129. }
  130. else
  131. {
  132. $dst_widthc=$dst_height*$src_width/$src_height;
  133. $dst_heightc=$dst_height;
  134. }
  135. MagickScaleImage ( $magic_water_handle, $dst_widthc, $dst_heightc );//缩放
  136. $this->magick_handle = NewMagickWand();
  137. MagickNewImage ( $this->magick_handle,$dst_width,$dst_height,$this->smallpic_bgcolor );
  138. MagickSetFormat ( $this->magick_handle,$srcext );
  139. MagickCompositeImage ( $this->magick_handle,$magic_water_handle,MW_OverCompositeOp, ( $dst_width-$dst_widthc ) /2, ( $dst_height-$dst_heightc ) /2 );
  140. }
  141. //打水印
  142. if ( $this->watermode == 1 )
  143. {
  144. $this->set_mark();
  145. }
  146. if ( empty ( $dst_file ) )
  147. {
  148. //建立临时文件
  149. $dst_file = tempnam ( $_SERVER["SINASRV_CACHE_DIR"],"TMP_IMG" );
  150. }
  151. MagickWriteImage ( $this->magick_handle, $dst_file );
  152. return $dst_file;
  153. }
  154. /**
  155. * 打水印
  156. *
  157. * @param $src_file 要打水印的图片路径
  158. * @param $dst_file 生产水印的文件保存路径,为空则生产随机临时文件
  159. * @return 水印文件路径/false
  160. */
  161. public function water_mark ( $src_file,$dst_file="" )
  162. {
  163. $this->magick_handle = NewMagickWand();
  164. if ( !MagickReadImage ( $this->magick_handle, $src_file ) )
  165. return false;
  166. $this->set_mark();
  167. if ( empty ( $dst_file ) )
  168. {
  169. //建立临时文件
  170. $dst_file = tempnam ( $_SERVER["SINASRV_CACHE_DIR"],"TMP_IMG" );
  171. }
  172. MagickWriteImage ( $this->magick_handle, $dst_file );
  173. return $dst_file;
  174. }
  175. /**
  176. * 对内接口
  177. * 给图片打水印
  178. *
  179. */
  180. protected function set_mark()
  181. {
  182. //尺寸
  183. $dst_width = MagickGetImageWidth ( $this->magick_handle );
  184. $dst_height = MagickGetImageHeight ( $this->magick_handle );
  185. //处理水印图
  186. if ( $this->water_mark && is_file ( $this->water_mark ) )
  187. {
  188. $magic_water_handle = NewMagickWand();
  189. MagickRemoveImage ( $magic_water_handle );
  190. if ( MagickReadImage ( $magic_water_handle, $this->water_mark ) )
  191. {
  192. MagickScaleImage ( $magic_water_handle, $dst_width*$this->waterrate, $dst_width*$this->waterrate*MagickGetImageHeight ( $magic_water_handle ) /MagickGetImageWidth ( $magic_water_handle ) );//缩放水印到图片的1/5
  193. if ( $this->water_mark_pos == 1 )
  194. {
  195. $left = $this->padding;
  196. $top = $this->padding;
  197. }
  198. elseif ( $this->water_mark_pos == 2 )
  199. {
  200. $left = $dst_width-$this->padding-MagickGetImageWidth ( $magic_water_handle );
  201. $top = $this->padding;
  202. }
  203. elseif ( $this->water_mark_pos == 3 )
  204. {
  205. $left = $this->padding;
  206. $top = $dst_height -$this->padding-MagickGetImageHeight ( $magic_water_handle );
  207. }
  208. elseif ( $this->water_mark_pos == 4 )
  209. {
  210. $left = $dst_width-$this->padding-MagickGetImageWidth ( $magic_water_handle );
  211. $top =$dst_height -$this->padding-MagickGetImageHeight ( $magic_water_handle );
  212. }
  213. elseif ( $this->water_mark_pos == 5 )
  214. {
  215. $left = ( $dst_width-MagickGetImageWidth ( $magic_water_handle ) ) /2;
  216. $top = ( $dst_height -MagickGetImageHeight ( $magic_water_handle ) ) /2;
  217. }
  218. MagickCompositeImage ( $this->magick_handle,$magic_water_handle,MW_OverCompositeOp,$left,$top );
  219. }
  220. }
  221. }
  222. }
复制代码

PHP


相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

0

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

101

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

12

2026.01.26

苹果官方查询网站 苹果手机正品激活查询入口
苹果官方查询网站 苹果手机正品激活查询入口

苹果官方查询网站主要通过 checkcoverage.apple.com/cn/zh/ 进行,可用于查询序列号(SN)对应的保修状态、激活日期及技术支持服务。此外,查找丢失设备请使用 iCloud.com/find,购买信息与物流可访问 Apple (中国大陆) 订单状态页面。

77

2026.01.26

npd人格什么意思 npd人格有什么特征
npd人格什么意思 npd人格有什么特征

NPD(Narcissistic Personality Disorder)即自恋型人格障碍,是一种心理健康问题,特点是极度夸大自我重要性、需要过度赞美与关注,同时极度缺乏共情能力,背后常掩藏着低自尊和不安全感,影响人际关系、工作和生活,通常在青少年时期开始显现,需由专业人士诊断。

5

2026.01.26

windows安全中心怎么关闭 windows安全中心怎么执行操作
windows安全中心怎么关闭 windows安全中心怎么执行操作

关闭Windows安全中心(Windows Defender)可通过系统设置暂时关闭,或使用组策略/注册表永久关闭。最简单的方法是:进入设置 > 隐私和安全性 > Windows安全中心 > 病毒和威胁防护 > 管理设置,将实时保护等选项关闭。

6

2026.01.26

2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】
2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】

铁路12306提供起售时间查询、起售提醒、购票预填、候补购票及误购限时免费退票五项服务,并强调官方渠道唯一性与信息安全。

92

2026.01.26

个人所得税税率表2026 个人所得税率最新税率表
个人所得税税率表2026 个人所得税率最新税率表

以工资薪金所得为例,应纳税额 = 应纳税所得额 × 税率 - 速算扣除数。应纳税所得额 = 月度收入 - 5000 元 - 专项扣除 - 专项附加扣除 - 依法确定的其他扣除。假设某员工月工资 10000 元,专项扣除 1000 元,专项附加扣除 2000 元,当月应纳税所得额为 10000 - 5000 - 1000 - 2000 = 2000 元,对应税率为 3%,速算扣除数为 0,则当月应纳税额为 2000×3% = 60 元。

24

2026.01.26

oppo云服务官网登录入口 oppo云服务登录手机版
oppo云服务官网登录入口 oppo云服务登录手机版

oppo云服务https://cloud.oppo.com/可以在云端安全存储您的照片、视频、联系人、便签等重要数据。当您的手机数据意外丢失或者需要更换手机时,可以随时将这些存储在云端的数据快速恢复到手机中。

68

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP水印与缩略图最新视频教程
PHP水印与缩略图最新视频教程

共10课时 | 1.7万人学习

PHP开发水印与缩略图教程
PHP开发水印与缩略图教程

共10课时 | 4.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号