PHP imagecopy()与imagecopymerge()图像添加水印

imagecopymerge() 函数用于拷贝并合并图像的一部分,成功返回 TRUE ,否则返回 FALSE 。

Windows下开启PHP的GD库支持

找到php.ini,打开内容,找到:

;extension=php_gd2.dll

把最前面的分号“;”去掉,再保存即可,如果本来就没有分号,那就是已经开启了

基本的语法

bool imagecopymerge( resource dst_im, resource src_im, int dst_x,
int dst_y, int src_x, int src_y, int src_w, int src_h, int pct )

参数说明: 参数 说明

dst_im 目标图像
src_im 被拷贝的源图像
dst_x 目标图像开始 x 坐标
dst_y 目标图像开始 y 坐标,x,y同为 0 则从左上角开始
src_x 拷贝图像开始 x 坐标
src_y 拷贝图像开始 y 坐标,x,y同为 0 则从左上角开始拷贝
src_w (从 src_x 开始)拷贝的宽度
src_h (从 src_y 开始)拷贝的高度
pct 图像合并程度,取值 0-100 ,当 pct=0 时,实际上什么也没做,反之完全合并。

当为 pct = 100 时对于调色板图像本函数和 imagecopy() 完全一样

知道了用法,要实现我们的功能就简单了,用下面的代码就可以轻松实现

 代码如下 复制代码

<?php
header("Content-type: image/jpeg");

//原始图像
$dst = "images/flower_1.jpg";

//得到原始图片信息
$dst_im = imagecreatefromjpeg($dst);
$dst_info = getimagesize($dst);

//水印图像
$src = "images/logo.gif";
$src_im = imagecreatefromgif($src);
$src_info = getimagesize($src);

//水印透明度
$alpha = 30;

//合并水印图片
imagecopymerge($dst_im,$src_im,$dst_info[0]-$src_info[0],$dst_info[1]-$src_info[1],0,0,$src_info[0],
$src_info[1],$alpha);

//输出合并后水印图片
imagejpeg($dst_im);
imagedestroy($dst_im);
imagedestroy($src_im);
?>

新版本之后imagecopymerge函数几乎不使用了,我们可直接使用imagecopy来生成水印两个函数的功能是完全一样的。

//增加水印
$watermark   =1;
$watertype   =2;
$waterstring =''; 
$waterimg="z.png";    //水印图片
$sFilePath ='aa.jpg';
if($watermark==1)
{
 $image_size = getimagesize($sFilePath); //上传的图片
 $water_size = getimagesize($waterimg);  //水印图片
 $iinfo=getimagesize($sFilePath,$iinfo);
 $nimage=imagecreatetruecolor($image_size[0],$image_size[1]);
 $white=imagecolorallocate($nimage,255,255,255);
 $black=imagecolorallocate($nimage,0,0,0);
 $red=imagecolorallocate($nimage,255,0,0);
 imagefill($nimage,0,0,$white);
 switch ($iinfo[2])
 {
  case 1:
   $simage =imagecreatefromgif($sFilePath);
   break;
  case 2:
   $simage =imagecreatefromjpeg($sFilePath);
   break;
  case 3:
   $simage =imagecreatefrompng($sFilePath);
   break;
//            case 6:
//            $simage =imagecreatefromwbmp($sFilePath);
//            break;
  default:
   die("不支持的文件类型");
   exit;
 }
 
 imagecopy($nimage,$simage,0,0,0,0,$image_size[0],$image_size[1]);
 
 switch($watertype)
 {
  case 1:   //加水印字符串
   imagestring($nimage,2,3,$image_size[1]-15,$waterstring,$black);
   break;
  case 2:   //加水印图片
   $simage1 =imagecreatefrompng($waterimg);     
   $x= $image_size[0]-$water_size[0];
   $y= $image_size[1]-$water_size[1];
   imagecopy($nimage,$simage1,$x,$y,0,0,240,65);
   imagedestroy($simage1);
   break;
 }
    
 switch ($iinfo[2])
 {
  case 1:
   imagegif($nimage, $sFilePath);
//            imagejpeg($nimage, $sFilePath);
   break;
  case 2:
   imagejpeg($nimage, $sFilePath);
   break;
  case 3:
   imagepng($nimage, $sFilePath);
   break;
//            case 6:
//            imagewbmp($nimage, $sFilePath);
//            //imagejpeg($nimage, $sFilePath);
//            break;
 }
 
 //覆盖原上传文件
 imagedestroy($nimage);
 imagedestroy($simage);
}

一个更好的功能,可以生成缩略并且还可以给图片添加水印

/***
 想操作图片
 先得把图片的大小,类型信息得到
 
 水印:就是把指定的水印复制到目标上,并加透明效果
 
 缩略图:就是把大图片复制到小尺寸画面上
 ***/  
 

 代码如下 复制代码

class ImageTool { 
    // imageInfo 分析图片的信息 
    // return array() 
    public static function imageInfo($image) { 
        // 判断图片是否存在 
        if (!file_exists($image)) { 
            return false; 
        } 
 
        $info = getimagesize($image); 
 
        if ($info == false) { 
            return false; 
        } 
 
        // 此时info分析出来,是一个数组 
        $img['width'] = $info[0]; 
        $img['height'] = $info[1]; 
        $img['ext'] = substr($info['mime'], strpos($info['mime'], '/') + 1); 
 
        return $img; 
    } 
 
    /*
     加水印功能
     parm String $dst 等操作图片
     parm String $water 水印小图
     parm String $save,不填则默认替换原始图
     */ 
    public static function water($dst, $water, $save = NULL, $pos = 2, $alpha = 50) { 
        // 先保证2个图片存在 
        if (!file_exists($dst) || !file_exists($water)) { 
            return false; 
        } 
 
        // 首先保证水印不能比待操作图片还大 
        $dinfo = self::imageInfo($dst); 
        $winfo = self::imageInfo($water); 
 
        if ($winfo['height'] > $dinfo['height'] || $winfo['width'] > $dinfo['width']) { 
            return false; 
        } 
 
        // 两张图,读到画布上! 但是图片可能是png,可能是jpeg,用什么函数读? 
        $dfunc = 'imagecreatefrom' . $dinfo['ext']; 
        $wfunc = 'imagecreatefrom' . $winfo['ext']; 
 
        if (!function_exists($dfunc) || !function_exists($wfunc)) { 
            return false; 
        } 
 
        // 动态加载函数来创建画布 
        $dim = $dfunc($dst); 
        // 创建待操作的画布 
        $wim = $wfunc($water); 
        // 创建水印画布 
 
        // 根据水印的位置 计算粘贴的坐标 
        switch($pos) { 
            case 0 : 
                // 左上角 
                $posx = 0; 
                $posy = 0; 
                break; 
 
            case 1 : 
                // 右上角 
                $posx = $dinfo['width'] - $winfo['width']; 
                $posy = 0; 
                break; 
 
            case 3 : 
                // 左下角 
                $posx = 0; 
                $posy = $dinfo['height'] - $winfo['height']; 
                break; 
 
            default : 
                $posx = $dinfo['width'] - $winfo['width']; 
                $posy = $dinfo['height'] - $winfo['height']; 
        } 
 
        // 加水印 
        imagecopymerge($dim, $wim, $posx, $posy, 0, 0, $winfo['width'], $winfo['height'], $alpha); 
 
        // 保存 
        if (!$save) { 
            $save = $dst; 
            unlink($dst); 
            // 删除原图 
        } 
 
        $createfunc = 'image' . $dinfo['ext']; 
        $createfunc($dim, $save); 
 
        imagedestroy($dim); 
        imagedestroy($wim); 
 
        return true; 
    } 
 
    /**
     thumb 生成缩略图
     等比例缩放,两边留白
     **/ 
    public static function thumb($dst, $save = NULL, $width = 200, $height = 200) { 
        // 首先判断待处理的图片存不存在 
        $dinfo = self::imageInfo($dst); 
        if ($dinfo == false) { 
            return false; 
        } 
 
        // 计算缩放比例 
        $calc = min($width / $dinfo['width'], $height / $dinfo['height']); 
 
        // 创建原始图的画布 
        $dfunc = 'imagecreatefrom' . $dinfo['ext']; 
        $dim = $dfunc($dst); 
 
        // 创建缩略画布 
        $tim = imagecreatetruecolor($width, $height); 
 
        // 创建白色填充缩略画布 
        $white = imagecolorallocate($tim, 255, 255, 255); 
 
        // 填充缩略画布 
        imagefill($tim, 0, 0, $white); 
 
        // 复制并缩略 
        $dwidth = (int)$dinfo['width'] * $calc; 
        $dheight = (int)$dinfo['height'] * $calc; 
 
        $paddingx = (int)($width - $dwidth) / 2; 
        $paddingy = (int)($height - $dheight) / 2; 
 
        imagecopyresampled($tim, $dim, $paddingx, $paddingy, 0, 0, $dwidth, $dheight, $dinfo['width'],

$dinfo['height']); 
 
        // 保存图片 
        if (!$save) { 
            $save = $dst; 
            unlink($dst); 
        } 
 
        $createfunc = 'image' . $dinfo['ext']; 
        $createfunc($tim, $save); 
 
        imagedestroy($dim); 
        imagedestroy($tim); 
 
        return true; 
 
    } 
 

时间: 2024-11-20 12:18:39

PHP imagecopy()与imagecopymerge()图像添加水印的相关文章

PHP图像操作教程:3D图、缩放、旋转、裁剪、添加水印

  图片操作在网站的应用相当广范,特别是现在互联网高度发达,很多内容都是以图片来显示,现在我们来讲讲用php来操作上传的图片,3D图片绘制.图片缩放.图片旋转.图片裁剪.图片添加水印. 1.利用php gd库的函数绘制3D扇形统计图 代码如下   <?php header("content-type","text/html;charset=utf-8"); /*扇形统计图*/ $image = imagecreatetruecolor(100, 100); /

PHP实现图片裁剪、添加水印效果代码_php实例

3.PHP对图像的裁剪 <div> <h4>裁剪之前</h4> <img src="1.png" style="border:1px solid red;"> </div> <?php header("content-type","text/html;charset=utf-8"); /* *图片裁剪 *@param string $filename 图片的ur

PHP GD库相关图像生成和处理函数小结_php技巧

本文总结了PHP GD库相关图像生成和处理函数.分享给大家供大家参考,具体如下: 这几天在学习图像验证码部分,参考了许多例子,都是用GD库来生成和绘制图像的,所以打算把GD库封装成类来使用,顺便也学习和练习一下PHP面向对象部分. 首先分析一下GD库所提供的函数,依据功能作了划分:(这只是常用的基础级函数,更高级的函数稍后再作研究) 1. create // 图像生成 A.绘制图像 imageCreate // 基于调色板(256色)的图像(gif/*) imageCreateTrueColor

PHP给图片添加文字或图片水印的实现代码

有时上传图片时,需要给图片添加水印,水印一般为文字或图片logo水印,下面就来看看两种添加方法. 一.文字水印 文字水印就是在图片上加上文字,主要使用gd库的imagefttext方法,并且需要字体文件.效果图如下: $dst_path = 'dst.jpg';  //创建图片的实例  $dst = imagecreatefromstring(file_get_contents($dst_path));    //打上文字  $font = './simsun.ttc';//字体路径    $b

php可生成缩略图的文件上传类实例_php技巧

本文实例讲述了php可生成缩略图的文件上传类及其用法.分享给大家供大家参考.具体实现方法如下: 类文件调用方法如下: 复制代码 代码如下: <?php if ($_GET['action'] == 'save') {                     $up = new upload();             $up->set_dir(dirname(__FILE__).'/upload/','{y}/{m}');             $up->set_thumb(100,

php文件上传类可生成缩略图代码

<?php         代码如下 复制代码 if ($_GET['action'] == 'save') {                   $up = new upload();            $up->set_dir(dirname(__FILE__).'/upload/','{y}/{m}');            $up->set_thumb(100,80);            $up->set_watermark(dirname(__FILE__).

php文件处理类

php文件处理类 <?php //------------------------------------- //------------------------------------- class upload {     var $dir;             //附件存放物理目录     var $time;             //自定义文件上传时间     var $allow_types;     //允许上传附件类型     var $field;            

php文字水印和php图片水印实现代码

 有时上传图片时需要给网站加上水印,水印可以分为文字水印和图片水印,下面就实现这二种水印 文字水印   文字水印就是在图片上加上文字,主要使用gd库的imagefttext方法,并且需要字体文件.效果图如下:   实现代码如下:   代码如下: $dst_path = 'dst.jpg';   //创建图片的实例 $dst = imagecreatefromstring(file_get_contents($dst_path));   //打上文字 $font = './simsun.ttc';

解密:阿里巴巴公司根据截图查到泄露信息的员工的技术是?

    本文通过一个的实验,简要介绍频域手段添加数字盲水印的方法,并进一步验证其抗攻击性.在上述实验的基础上,总结躲避数字盲水印的方法.(多图预警) 本文分为四个部分,第一部分综述:第二部分频域数字盲水印制作原理介绍:第三部分盲水印攻击性实验:第四部分总结: 一.综述 本文提供的一种实现"阿里通过肉眼无法识别的标识码追踪员工"的技术手段.通过看其他答主的分析,阿里可能还没用到频域加水印的技术. 相对于空域方法,频域加盲水印的方法隐匿性更强,抵抗攻击能力更强.这类算法解水印困难,你不知道