博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP给图片添加水印
阅读量:7049 次
发布时间:2019-06-28

本文共 3699 字,大约阅读时间需要 12 分钟。

计应134(实验班)   詹加全

有些站点也许是出于推广或者防盗的目的在上传图片时给图片加上一个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);
 

?>

给图片添加水印除了用基础的GD库实现,其实还可以ImageMagick这个工具,它的功能更强大,不过一般没多大需求,就用上面这个代码了。

转载于:https://www.cnblogs.com/z-j-q/p/4987428.html

你可能感兴趣的文章
Codeforces Round #526 (Div. 1)
查看>>
NX签名//NXOpen VB.Net / C# Sign
查看>>
Mac下安装nginx
查看>>
<转>IOS多线程
查看>>
微信服务号、订阅号和企业号的差别(运营和开发两个角度)
查看>>
AOP之AspectJ
查看>>
SHELL里执行HIVE导出文件处理成CSV文件
查看>>
Python菜鸟之路:Django 路由补充1:FBV和CBV - 补充2:url默认参数
查看>>
【转】生活感悟
查看>>
【leetcode】965. Univalued Binary Tree
查看>>
第十五周学习报告
查看>>
tomcat用户设置
查看>>
LINQ实现行列转换
查看>>
PHP最全笔记(五)(值得收藏,不时翻看一下)
查看>>
拦截器与过滤器的区别
查看>>
移动开发知识点收集
查看>>
smarty练习: 设置试题及打印试卷
查看>>
替换子节点时 的注意事项
查看>>
groupinfo
查看>>
Django2.1.3 smtp 邮件 553报警
查看>>