php实现图片上传时添加文字和图片水印技巧


Posted in PHP onApril 18, 2020

本文实现的功能特别适用于一些商城和图片站中,分享了图片在上传时添加文字和图片水印的技巧,供大家参考,具体内容如下

1. water.class.php

<?php
header('Content-Type:text/html;charset=utf-8');
/* 
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
//给图片添加水印
Class Water{
 //开启水印
 private $watermark_on = '1';
  
 public $water_img;
  
 //水印位置
 public $pos = 1; 
  
 //压缩比
 public $pct = 80;
  
 //透明度
 public $quality = 80;
  
 public $text = '乐趣网zlblog.sinaapp.com';
  
 public $size = 12;
  
 public $color = '#000000';
  
 public $font = 'font.ttf';
  
 public function watermark( $img,$pos='',$out_img='',$water_img='',$text='' ){
  if(!$this->check($img) || !$this->watermark_on) return false;
   
  $water_img = $water_img ? $water_img : $this->water_img;
  //水印的开启状态
  $waterimg_on = $this->check($water_img) ? 1 : 0;
  //判断是否在原图上操作
  $out_img = $out_img ? $out_img : $img;
  //判断水印的位置
  $pos = $pos ? $pos : $this->pos;
  //水印文字
  $text = $text ? $text : $this->text;
   
   
  $img_info = getimagesize($img);
  $img_w = $img_info[0];
  $img_h = $img_info[1];
  //判断水印图片的类型
   
   
  if( $waterimg_on ){
   $w_info = getimagesize($water_img);
   $w_w = $w_info[0];
   $w_h = $w_info[1];
   if ( $img_w < $w_w || $img_h < $w_h ) return false;
   switch ( $w_info[2] ){
    case 1:
     $w_img = imagecreatefromgif($water_img);
     break;
    case 2:
     $w_img = imagecreatefromjpeg($water_img);
     break;
    case 3:
     $w_img = imagecreatefrompng($water_img);
     break;
   }
  }else{
   if( empty($text) || strlen($this->color)!=7 ) return FALSE;
   $text_info = imagettfbbox($this->size, 0, $this->font, $text);
   $w_w = $text_info[2] - $text_info[6];
   $w_h = $text_info[3] - $text_info[7];
  }
   
  //建立原图资源
   
  switch ( $img_info[2] ){
   case 1:
    $res_img = imagecreatefromgif($img);
    break;
   case 2:
    $res_img = imagecreatefromjpeg($img);
    break;
   case 3:
    $res_img = imagecreatefrompng($img);
    break;
  }
  //确定水印的位置
  switch ( $pos ){
   case 1:
    $x = $y =25;
    break;
   case 2:
    $x = ($img_w - $w_w)/2; 
    $y = 25;
    break;
   case 3:
    $x = $img_w - $w_w;
    $y = 25;
    break;
   case 4:
    $x = 25;
    $y = ($img_h - $w_h)/2;
    break;
   case 5:
    $x = ($img_w - $w_w)/2; 
    $y = ($img_h - $w_h)/2;
    break;
   case 6:
    $x = $img_w - $w_w;
    $y = ($img_h - $w_h)/2;
    break;
   case 7:
    $x = 25;
    $y = $img_h - $w_h;
    break;
   case 8:
    $x = ($img_w - $w_w)/2;
    $y = $img_h - $w_h;
    break;
   case 9:
    $x = $img_w - $w_w;
    $y = $img_h - $w_h;
    break;
   default :
    $x = mt_rand(25, $img_w - $w_w);
    $y = mt_rand(25, $img_h - $w_h);
  }
   
  //写入图片资源
  if( $waterimg_on ){
   imagecopymerge($res_img, $w_img, $x, $y, 0, 0, $w_w, $w_h, $this->pct); 
 }else{
  $r = hexdec(substr($this->color, 1,2));
  $g = hexdec(substr($this->color, 3,2));
  $b = hexdec(substr($this->color, 5,2));
  $color = imagecolorallocate($res_img, $r, $g, $b);
  imagettftext($res_img, $this->size, 0, $x, $y, $color, $this->font, $text); 
 }
  
 //生成图片类型
 switch ( $img_info[2] ){
  case 1:
   imagecreatefromgif($res_img,$out_img);
   break;
  case 2:
   //imagecreatefromjpeg($res_img,$out_img);
   imagejpeg($res_img,$out_img);
   break;
  case 3:
   imagejpeg($res_img,$out_img);
   break;
 }
 if(isset($res_img)) imagedestroy ($res_img);
 if(isset($w_img)) imagedestroy($w_img);
 return TRUE;
} 
 //验证图片是否存在
  private function check($img){
   $type = array('.jpg','.jpeg','.png','.gif');
   $img_type = strtolower(strrchr($img, '.'));
   return extension_loaded('gd') && file_exists($img) && in_array($img_type, $type);
  } 
}

2. test1.php

<?php
 
/* 
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
//header('Content-Type:text/html;charset=utf-8');
include 'water.class.php';
$image = new Water();
$image->watermark('12.jpg',5);
//$image->watermark('12.jpg',1);

3.效果图

php实现图片上传时添加文字和图片水印技巧

以上就是本文的全部内容,希望对大家学习PHP程序设计有所帮助。

PHP 相关文章推荐
完美实现GIF动画缩略图的php代码
Jan 02 PHP
PHP mb_convert_encoding文字编码的转换函数介绍
Nov 10 PHP
用来解析.htpasswd文件的PHP类
Sep 05 PHP
Yii操作数据库的3种方法
Mar 11 PHP
php可应用于面包屑导航的递归寻找家谱树实现方法
Feb 02 PHP
php使用parse_url和parse_str解析URL
Feb 22 PHP
PHP的伪随机数与真随机数详解
May 27 PHP
php中动态变量用法实例
Jun 10 PHP
php自动载入类用法实例分析
Jun 24 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
Dec 07 PHP
PHP利用Cookie设置用户30分钟未操作自动退出功能
Jul 03 PHP
laravel 修改记住我功能的cookie保存时间的方法
Oct 14 PHP
PHP实现适用于文件内容操作的分页类
Jun 15 #PHP
PHP实现适用于自定义的验证码类
Jun 15 #PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
Jun 15 #PHP
使用JavaScript创建新样式表和新样式规则
Jun 14 #PHP
PHP list() 将数组中的值赋给变量的简单实例
Jun 13 #PHP
PHP处理二进制数据的实现方法
Jun 13 #PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
Jun 13 #PHP
You might like
PHP获取网站域名和地址的代码
2008/08/17 PHP
fgetcvs在linux的问题
2012/01/15 PHP
PHP+javascript制作带提示的验证码源码分享
2014/05/28 PHP
php往mysql中批量插入数据实例教程
2018/12/12 PHP
jQuery获取选中内容及设置元素属性的方法
2014/07/09 Javascript
JavaScript前端图片加载管理器imagepool使用详解
2014/12/29 Javascript
js鼠标点击图片切换效果实现代码
2015/11/19 Javascript
详解利用exif.js解决ios手机上传竖拍照片旋转90度问题
2016/11/04 Javascript
angular4+百分比进度显示插件用法示例
2019/05/05 Javascript
[02:02]DOTA2英雄基础教程 斯拉达
2013/12/11 DOTA
[33:39]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第二局
2016/02/27 DOTA
实例讲解Python中函数的调用与定义
2016/03/14 Python
Python Paramiko模块的安装与使用详解
2016/11/18 Python
python web基础之加载静态文件实例
2018/03/20 Python
Python实现快速傅里叶变换的方法(FFT)
2018/07/21 Python
Python使用logging模块实现打印log到指定文件的方法
2018/09/05 Python
Python父目录、子目录的相互调用方法
2019/02/16 Python
解决django中ModelForm多表单组合的问题
2019/07/18 Python
python 根据字典的键值进行排序的方法
2019/07/24 Python
Python3分析处理声音数据的例子
2019/08/27 Python
python获取array中指定元素的示例
2019/11/26 Python
Python xml、字典、json、类四种数据类型如何实现互相转换
2020/05/27 Python
win10下python3.8的PIL库安装过程
2020/06/08 Python
HTML5重塑Web世界它将如何改变互联网
2012/12/17 HTML / CSS
高清安全摄像头系统:Lorex Technology
2018/07/20 全球购物
eDreams德国:南欧领先的在线旅游公司
2020/12/07 全球购物
使用索引有什么好处
2016/07/27 面试题
完美实现CSS垂直居中的11种方法
2021/03/27 HTML / CSS
哈理工毕业生的求职信
2013/12/22 职场文书
优秀志愿者事迹材料
2014/02/03 职场文书
视光学毕业生自荐书范文
2014/02/13 职场文书
广播节目策划方案
2014/05/23 职场文书
2014年音乐教师工作总结
2014/12/03 职场文书
酒店温馨提示语
2015/07/14 职场文书
升学宴来宾致辞
2015/07/27 职场文书
redis实现的四种常见限流策略
2021/06/18 Redis