网站地图    收藏   

主页 > 后端 > php资料库 >

PHP给图片添加水印实现代码_自学php网

来源:自学PHP网    时间:2014-12-04 22:12 作者: 阅读:

[导读] 有些站点也许是出于推广或者防盗的目的在上传图片时给图片加上一个LOGO水印,我就见过有些站长直接用图片工具添加水印然后再上传,当然这样也能实现效果。但PHP中也可以完成给图...

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

一、准备好LOGO图

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

二、写水印类

为什么要写成类,这是趋于人类思想,也方便使用维护。这里重点给出以下函数名,也就是实现水印功能主要就是靠这些函数功能操作
1.imagecreatefromjpeg // 打开JPG图片 2.imagecreatefromgif // 打开GIF图片
3.imagecreatefrompng // 打开PNG图片
4.imagecreatefromwbmp // 打开WBMP图片(比较少用)
5.getimagesize // 获取图片大小信息
6.imagecopymerge // 把多张图片整合(添加水印的主要函数)
7.imagejpeg // 保存JPG图片
8.imagegif // 保存GIF图片
9.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);

?>

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论