PHP中给图片添加水印

有些站点也许是出于推广或者防盗的目的在上传图片时给图片加上一个 LOGO 水印,我就见过有些站长直接用图片工具添加水印然后再上传,当然这样也能实现效果。但 PHP 中也可以完成给图片加水印的功能。就 PHP 函数功能这里就不再去浪费口舌介绍了,直接说下如何实现。大体有以下步骤

一、准备好 LOGO 图

这个 LOGO 图不限格式,gif 或 png 或 jpg 都可以,大小调成合适的即可。透明度不需要,因为我们可以在 PHP 中灵活设置透明度。如果不会使用制图工具制作 LOGO 可以去谷歌一下在线 LOGO 制作,随便点击进入一个链接敲几个字即可生成,当然是免费的。

二、写水印类

为什么要写成类,这是趋于人类思想,也方便使用维护。这里重点给出以下函数名,也就是实现水印功能主要就是靠这些函数功能操作

imagecreatefromjpeg // 打开 JPG 图片 imagecreatefromgif    // 打开 GIF 图片 imagecreatefrompng // 打开 PNG 图片 imagecreatefromwbmp // 打开 WBMP 图片(比较少用) getimagesize // 获取图片大小信息 imagecopymerge // 把多张图片整合(添加水印的主要函数) imagejpeg // 保存 JPG 图片 imagegif    // 保存 GIF 图片 imagepng // 保存 PNG 图片

完成以上步骤以后,你就可以给你上传的图片添加水印了。以下是我写的一个小 DEMO

水印类

<?php
/**
 * 加水印类
 * 沈唁志
 */
 
class water{
 
 private $imgPath; // 图片路径
 
 public function __construct($imgPath="./"){
 $this->imgPath = rtrim($imgPath,"/")."/";
 }
 
 // 写水印动作
 public function waterInfo($ground,$water,$pos=0,$prefix="lee_",$tm=50){
 $allPathGround = $this->imgPath.$ground;
 $allPathWater = $this->imgPath.$water;
 $groundInfo = $this->imgInfo($allPathGround); 
 $waterInfo = $this->imgInfo($allPathWater);
 
 //判断水印图片是否比原图大
 if(!$newPos=$this->imgPos($groundInfo,$waterInfo,$pos)){
 echo "您的水印图片比原图大哦"; 
 return false;
 }
 
 //打开资源
 $groundRes=$this->imgRes($allPathGround,$groundInfo['mime']);
 $waterRes=$this->imgRes($allPathWater,$waterInfo['mime']);
 
 //整合资源
 $newGround=$this->imgCopy($groundRes,$waterRes,$newPos,$waterInfo,$tm);
 
 //保存资源
 $this->saveImg($newGround,$ground,$groundInfo['mime'],$prefix);
 
 }
 
 private function saveImg($img,$ground,$info,$prefix){
 $path=$this->imgPath.$prefix.$ground;
 switch($info){
 case "image/jpg": 
 case "image/jpeg":
 case "image/pjpeg":
 imagejpeg($img,$path);
 break;
 case "image/gif":
 imagegif($img,$path);
 break;
 case "image/png":
 imagepng($img,$path);
 break;
 default:
 imagegd2($img,$path); 
 } 
 }
 
 private function imgCopy($ground,$water,$pos,$waterInfo,$tm){ 
 imagecopymerge($ground,$water,$pos[0],$pos[1],0,0,$waterInfo[0],$waterInfo[1],$tm);
 return $ground;
 }
 
 private function imgRes($img,$imgType){
 switch($imgType){
 case "image/jpg": 
 case "image/jpeg":
 case "image/pjpeg":
 $res=imagecreatefromjpeg($img);
 break;
 case "image/gif":
 $res=imagecreatefromgif($img);
 break;
 case "image/png":
 $res=imagecreatefrompng($img);
 break;
 case "image/wbmp":
 $res=imagecreatefromwbmp($img);
 break;
 default:
 $res=imagecreatefromgd2($img);
 } 
 return $res;
 }
 
 // 位置为
 // 1 左上 2 中上 3 右上
 // 4 左中 5 中中 6 右中
 // 7 左下 8 中下 9 右下
 // 0 随机位置
 private function imgPos($ground,$water,$pos){
 if($ground[0]<$water[0] || $ground[1]<$water[1]) //判断水印与原图比较 如果水印的高或者宽比原图小 将返回假
 return false;
 switch($pos){
 case 1:
 $x=0;
 $y=0;
 break;
 case 2:
 $x=ceil(($ground[0]-$water[0])/2);
 $y=0;
 break;
 case 3: 
 $x=$ground[0]-$water[0];
 $y=0;
 break;
 case 4:
 $x=0;
 $y=ceil(($ground[1]-$water[1])/2);
 break;
 case 5:
 $x=ceil(($ground[0]-$water[0])/2);
 $y=ceil(($ground[1]-$water[1])/2);
 break;
 case 6:
 $x=$ground[0]-$water[0];
 $y=ceil(($ground[1]-$water[1])/2);
 break;
 case 7:
 $x=0;
 $y=$ground[1]-$water[1];
 break;
 case 8:
 $x=ceil($ground[0]-$water[0]/2);
 $y=$ground[1]-$water[1];
 break;
 case 9:
 $x=$ground[0]-$water[0];
 $y=$ground[1]-$water[1];
 break;
 case 0:
 default:
 $x=rand(0,$ground[0]-$water[0]);
 $y=rand(0,$ground[1]-$water[1]);
 }
 $xy[]=$x;
 $xy[]=$y;
 return $xy; 
 }
 
 // 获取图片信息的函数
 private function imgInfo($img){
 return getimagesize($img); 
 }
}
?> 

使用页面

<?php
 // 包含类文件
include("water.class.php"); 
 
// 可以传进一个添加水印后保存的路径,路径相对于类脚本
// 如果为空则默认是脚本当前路径
$water=new water(); 
 
// 参数:
// 1. 源图 
// 2. 水印图 即 LOGO
// 3. 位置 
// 位置为
// 1 左上 2 中上 3 右上
// 4 左中 5 中中 6 右中
// 7 左下 8 中下 9 右下
// 0 随机位置
 // 4. 保存添加水印图片的文件名前缀 
// 5. 透明度
$water->waterInfo("02.jpg","01.jpg",9,"haha",20);
 
?>
 
 
 沈唁志|一个PHPer的成长之路! 原创文章采用CC BY-NC-SA 4.0协议进行许可,转载请注明:转载自:PHP中给图片添加水印

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逸鹏说道

前端常用插件

插件 parallel.js: 前后端通用的一个并行库 zepto: 用于现代浏览器的兼容 jQuery 的库 totoro: 稳定的跨浏览器测试工具 Thea...

70260
来自专栏Material Design组件

Material Design — Navigation drawerStandard drawer Modal drawer Bottom drawer

25840
来自专栏无原型不设计

盘点3款原型工具的部件样式

使用样式是集中管理整个项目的外观及感受的最优方法,通过部件样式可以像word一样对组件进行快速方便的样式设置,大大提高了制作原型的效率。当项目要更新视觉设计时...

38050
来自专栏数据小魔方

think-cell chart系列19——任务甘特图

今天跟大家分享think-cell chart系列19——任务甘特图。 甘特图在之前的教程中曾经讲过,当时是在excel中制作完成的,花费了相当多的时间和功夫。...

97970
来自专栏娱乐心理测试

移动端图标生成工具

16300
来自专栏游戏杂谈

Android应用icon和闪屏splash的尺寸

我查看支付宝钱包的时候,发现drawable-xxxhdpi里面的尺寸是180 x 180,不是上面标的192 x 192

17010
来自专栏程序员的知识天地

HTML/CSS/JS 是如何在浏览器中,渲染成你看到的页面?【图解Chrome】

Chrome 算是程序员的标配了,从全球的市场份额来看,它在全球市场的份额已经超过 60%。

40540
来自专栏Android Note

[译] 带你领略 ConstraintLayout 1.1 的新功能前言带你领略 ConstraintLayout 1.1 的新功能

20320
来自专栏吴裕超

点击穿透原理及解决

一、事件触发顺序 PC网页上的大部分操作都是用鼠标的,即响应的是鼠标事件,包括mousedown、mouseup、mousemove和click事件。一次点击行...

76460
来自专栏Material Design组件

Human Interface Guidelines —— Buttons

15960

扫码关注云+社区

领取腾讯云代金券