跳转到帖子
  • 游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

    赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

    TheHackerWorld官方

PHP实现图片加文字/图案水印


HACK1949

推荐的帖子

需求:在一张背景图上添加二维码(带不同),并且个人名字,联系方式和个人头像。

思路:二维码和头像相当于往图片上添加图片,个人姓名和联系方式相当于玩图片上添加文字,这就是文字/图案水印了。思路就是上网百度!!

历经辛苦,找到一篇看起来可能会明白,简洁,简短的文章:(http://www.jb51.net/article/44829.htm)
//添加图片水印

 

$dst_path = 'dst.jpg';
$src_path = 'src.jpg';
//创建图片的实例
$dst = imagecreatefromstring(file_get_contents($dst_path));
$src = imagecreatefromstring(file_get_contents($src_path));
//获取水印图片的宽高
list($src_w, $src_h) = getimagesize($src_path);
//将水印图片复制到目标图片上,最后个参数50是设置透明度,这里实现半透明效果
imagecopymerge($dst, $src, 10, 10, 0, 0, $src_w, $src_h, 50);
//如果水印图片本身带透明色,则使用imagecopy方法
//imagecopy($dst, $src, 10, 10, 0, 0, $src_w, $src_h);
//输出图片
list($dst_w, $dst_h, $dst_type) = getimagesize($dst_path);
switch ($dst_type) {
    case 1://GIF
        header('Content-Type: image/gif');
        imagegif($dst);
        break;
    case 2://JPG
        header('Content-Type: image/jpeg');
        imagejpeg($dst);
        break;
    case 3://PNG
        header('Content-Type: image/png');
        imagepng($dst);
        break;
    default:
        break;
}
imagedestroy($dst);
imagedestroy($src);

 

因为之前很少接触图片方面的需求,通过观察代码哈哈哈,发现添加【图片水印】的思路是这样的:
1.确定背景图和水印图,利用这两个图片创建两个实例,实例相当于一种图片资源,在图片上添加文字或者图片,就是对实例进行操作,根据图片文件格式选择创建实例的方式,如果图片是jpg格式,则使用imagecreatefromjpeg();如图中所示,也可以先用file_get_contents获取到图片的内容,然后用imagecreatefromstring()来根据图片内容创建实例;

2.确定水印图片的左顶点的坐标(x,y),和设计师确认一下摆放水印图片的位置,水平和垂直距离是多少,像素单位,如图中程序里面的10,10;再得到水印图片的宽和长,如程序中的srcw和srcw和src_h;

3.确定好各项参数后,需要把水印图片和背景图合在一起
//将水印图片复制到目标图片上,最后个参数50是设置透明度,这里实现半透明效果
imagecopymerge(dst,dst,src, 10, 10, 0, 0, srcw,srcw,src_h, 50);
//如果水印图片本身带透明色,则使用imagecopy方法
//imagecopy(dst,dst,src, 10, 10, 0, 0, srcw,srcw,src_h);

当imagecopymerge最后的设置透明度的参数为100的时候,就相当于imagecopy,当透明度为0,则相当于没有显示出水印图片

4.把水印加在背景图上后,可以直接显示出图片,也可以把修改的图片实例保存到文件上
这段代码就是根据图片的格式,选择相应的方法,把图片显示出来

list($dst_w, $dst_h, $dst_type) = getimagesize($dst_path);
switch ($dst_type) {
    case 1://GIF
        header('Content-Type: image/gif');
        imagegif($dst);
        break;
    case 2://JPG
        header('Content-Type: image/jpeg');
        imagejpeg($dst);
        break;
    case 3://PNG
        header('Content-Type: image/png');
        imagepng($dst);
        break;
    default:
        break;
}

 

//保存到文件上
选择想要保存的格式,例如想把图片保存为jpg格式的文件,则imagejpeg(实例,保存路径);如imagejpeg($dst,’test.jpg’);

以上,添加图片水印完成。
弄完图片水印,就来研究一下【文字水印】。天真的我本来以为文字水印就是简单的文字,添加上去,没想到还是比较复杂的。。。

//添加文字水印

$dst_path = 'dst.jpg';
//创建图片的实例
$dst = imagecreatefromstring(file_get_contents($dst_path));
//打上文字
$font = './simsun.ttc';//字体
$black = imagecolorallocate($dst, 0x00, 0x00, 0x00);//字体颜色
imagefttext($dst, 13, 0, 20, 20, $black, $font, '快乐编程');
//输出图片
list($dst_w, $dst_h, $dst_type) = getimagesize($dst_path);
switch ($dst_type) {
    case 1://GIF
        header('Content-Type: image/gif');
        imagegif($dst);
        break;
    case 2://JPG
        header('Content-Type: image/jpeg');
        imagejpeg($dst);
        break;
    case 3://PNG
        header('Content-Type: image/png');
        imagepng($dst);
        break;
    default:
        break;
}
imagedestroy($dst);

 

以上的代码是上面附加的文章链接里面的完整代码,天真的我以为,直接复制,粘贴!OK!完成!结果!不行!
试过其他的办法,发现其他的办法会导致乱码,中文你懂的,所以还是要使用imagefttext(),这个方法可以使用配置的字体,乱码问题就不会出现了。
参考以下这篇文章,修改了一下代码,可以用了!偶像!
http://www.uncletoo.com/html/application/808.html
以下代码测试可用(不同环境不一定哦)

 

header("Content-type:image/jpeg");
//对比一下,以下代码和以上代码的差别主要是这一行
imagealphablending($image, true);
//设置颜色,后三个数字参数是RGB
$white = imagecolorallocate($image, 255,255, 255);
//字体文件路径,simsun宋体
$font = './assets/simsun.ttc';

//添加上姓名和联系方式,第二个参数设定font-size,第三个参数设定字体的阅读方向,0则为从左到右阅读,具体查一下PHP手册,第四和第五个参数则为文字水印的摆放坐标,第六是字体颜色,第七是字体样式,第八是文字内容
imagefttext($image, 17, 0, 388, 240, $white , $font, $name);
imagefttext($image, 17, 0, 388, 305, $white , $font, $phone);

 


对了,字体的文件从网上下载好,放到合适的路径使用哦。

以上添加图片和文字水印已经完成了,但是还有一个难点,需求里面包括了摆放个人的头像,而且头像需要裁剪成圆形头像。。。。没事!老铁!不要放弃!

搜了几个代码,有一个陷入死循环,有一个使用Imagick类,但是看到这位大哥的代码,不使用自带的类就写出来了,膜拜!上链接!
http://blog.csdn.net/sugang_ximi/article/details/30762421
通过观察大哥的代码,慢慢理解了他的思路,主要就是利用到了圆和正方形的关系,怎么说来着,我转换一下说法,大概是正方形的边长和圆的直径相等,那么该圆的圆心和正方形的中心为同一点。。。不知道怎么说啊,反正圆能被正方形嵌套。。。

而大哥的代码的逻辑又是什么呢?我的理解是,先用圆的直径为边长,画一个正方形,然后把头像嵌入到正方形里面,再把正方形减去圆形的四个角作处理,可透明也可适应背景色,毫无破绽!

所以当务之急是什么呢!!!就是找到圆的半径!通过与设计师沟通,得知用户的头像的圆形框是一个半径为50cm的圆!!

说实在的,好像我也没理解大哥的逻辑是什么样的,不过已经测试可用,我就直接用了,然后到了下班时间,我要去吃饭了。。。。
————————————————
版权声明:本文为CSDN博主「吃完苹果好睡觉」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012866684/article/details/68068265

链接帖子
意见的链接
分享到其他网站

黑客攻防讨论组

黑客攻防讨论组

    You don't have permission to chat.
    • 最近浏览   0位会员

      • 没有会员查看此页面。
    ×
    ×
    • 创建新的...