PHP中给图片添加水印
时间:2022-05-30
本文章向大家介绍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);
?>
- Microsoft 防跨站点脚本库AntiXSS Library v4.2.1
- Compilify——让你在浏览器中编译.NET代码
- Python进阶-面向对象
- WCF RESTful服务的Google Protocol Buffers超媒体类型
- 使用CoreOs,Docker和Nirmata部署微服务类型的应用
- .NET 4 上的REST 框架
- 结合游戏开发与人工智能研究,游戏大厂 Ubisoft 成立AI研发部门
- Quartz.NET的管理工具
- Python-执行系统命令
- css3 UI 修饰——回顾
- Windows Phone 7实战 第一天 设计启动页面和应用程序图标
- css3响应式布局设计——回顾
- Windows Phone 7 实战第二天 二维码QRcode
- Python-面向对象编程
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- IDEA多线程调试
- 为什么wait和notify方法要在同步块中调用?
- 一文说清楚Mysql Innodb的B+树索引原理及其推理过程
- [Oracle数据泵全解析]expdp交互式命令行模式命令
- SpringBoot Feign文件上传
- Docker_000
- 如何应对面试官的JVM调优问题
- Docker_001
- Docker_002
- [PyQt Tutorial]2.一个Hello World程序
- Oracle设置开机自启
- Go_学习之Docke容器
- zabbix 监控项
- [PyQt Tutorial]4.使用Qt Designer
- [PyQt Tutorial]5.Signals & Slots(信号与槽)