copy图像和php,PHP imagecopy()与imagecopymerge()图像添加水印

这篇博客介绍了如何在PHP中利用GD库添加水印和生成缩略图。首先,确保GD库已开启,然后使用imagecopymerge()或imagecopy()函数添加水印,通过调整透明度实现不同程度的融合。接着,讲解了生成缩略图的方法,通过等比例缩放并留白来保持图像比例。最后,提供了一个ImageTool类,实现了加水印和生成缩略图的功能。
摘要由CSDN通过智能技术生成

图像添加水印在php中有很多种办法可以实现,他这些功能都是基于php中的GD库的,如果没有开户GD库是不可以使用水印功能的.

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() 完全一样,知道了用法,要实现我们的功能就简单了,用下面的代码就可以轻松实现,代码如下:

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);

//开源代码phpfensi.com

//输出合并后水印图片

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])

{

case1:

$simage=imagecreatefromgif($sFilePath);

break;

case2:

$simage=imagecreatefromjpeg($sFilePath);

break;

case3:

$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)

{

case1://加水印字符串

imagestring($nimage,2,3,$image_size[1]-15,$waterstring,$black);

break;

case2://加水印图片

$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])

{

case1:

imagegif($nimage,$sFilePath);

//            imagejpeg($nimage, $sFilePath);

break;

case2:

imagejpeg($nimage,$sFilePath);

break;

case3:

imagepng($nimage,$sFilePath);

break;

//            case 6:

//            imagewbmp($nimage, $sFilePath);

//            //imagejpeg($nimage, $sFilePath);

//            break;

}

//覆盖原上传文件

imagedestroy($nimage);

imagedestroy($simage);

}

一个更好的功能,可以生成缩略并且还可以给图片添加水印,想操作图片,先得把图片的大小,类型信息得到,水印:就是把指定的水印复制到目标上,并加透明效果,缩略图:就是把大图片复制到小尺寸画面上,代码如下:

classImageTool {

// imageInfo 分析图片的信息

// return array()

publicstaticfunctionimageInfo($image) {

// 判断图片是否存在

if(!file_exists($image)) {

returnfalse;

}

$info=getimagesize($image);

if($info== false) {

returnfalse;

}

// 此时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,不填则默认替换原始图

*/

publicstaticfunctionwater($dst,$water,$save= NULL,$pos= 2,$alpha= 50) {

// 先保证2个图片存在

if(!file_exists($dst) || !file_exists($water)) {

returnfalse;

}

// 首先保证水印不能比待操作图片还大

$dinfo= self::imageInfo($dst);

$winfo= self::imageInfo($water);

if($winfo['height'] >$dinfo['height'] ||$winfo['width'] >$dinfo['width']) {

returnfalse;

}

// 两张图,读到画布上! 但是图片可能是png,可能是jpeg,用什么函数读?

$dfunc='imagecreatefrom'.$dinfo['ext'];

$wfunc='imagecreatefrom'.$winfo['ext'];

if(!function_exists($dfunc) || !function_exists($wfunc)) {

returnfalse;

}

// 动态加载函数来创建画布

$dim=$dfunc($dst);

// 创建待操作的画布

$wim=$wfunc($water);

// 创建水印画布

// 根据水印的位置 计算粘贴的坐标

switch($pos) {

case0 :

// 左上角

$posx= 0;

$posy= 0;

break;

case1 :

// 右上角

$posx=$dinfo['width'] –$winfo['width'];

$posy= 0;

break;

case3 :

// 左下角

$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);

returntrue;

}

/**

thumb 生成缩略图

等比例缩放,两边留白

**/

publicstaticfunctionthumb($dst,$save= NULL,$width= 200,$height= 200) {

// 首先判断待处理的图片存不存在

$dinfo= self::imageInfo($dst);

if($dinfo== false) {

returnfalse;

}

// 计算缩放比例

$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);

returntrue;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值