GD函数库(三)—等比缩放及水印实现

PHP学习 cyanprobe 9年前 (2015-07-18) 4793次浏览 已收录 2个评论

前言:

今晚月黑风高,正直10点钟我要下班的时候,我一打开一楼的门,发现……玻璃展示柜子那恍恍惚惚有些黑影,我定睛一看!尽然……尽然…… 尽然是人!!!男人,还有女人!!吓死我了。然而基佬马君收到一个订货单,尼玛10点KFC不接受外送,这哥们9点59分打电话定外送,还住在上海滩花园来回至少半个小时。可怜的基佬……但是,基佬说这家是个妹纸!
妹纸怎么了!妹纸就可以9点59分59秒定外卖么!我那义正言辞的暴脾气。我抡起电瓶就冲了出去~马君教我骑车,强烈的保护欲告诉我,不能让妹纸饿肚子,历经艰辛万苦,冒着被卡车撞死和被劫色抛尸的危险……在路上,在路上,尼玛我电瓶剩了一格点,于是我果断换成了人工模式…
后来的后来,十分钟之前,我不认识你,你不认识我,我们还是陌生人。这样一次偶然的夜晚邂逅,月色隐约栖身于乌云中,缥缈晦涩…… 尼玛!!这妹子毛都长脸上了! 带不带着这么坑的!!卧槽。

正文:

好像扯了些没用的啊 ,说好的GD库呢?(王语双流可以止步于此了),那好,今天我们就来学习GD函数库PHP对图片文件的处理等比缩放和图片水印的实现。
2015-07-17_000452

等比缩放实现过程:

其中的过程实现是,通过计算获得原图与新图的长和宽,再利用imagecopyresampled();或者imagecopyresized();函数实现等比缩放。前者最广泛使用,获得的图像较为平滑,但执行速度稍慢,后者图像粗糙但执行速度快。

 <?php
$sourceFile="img/1.jpg"//;原图路径
$sourceNew="img/new.jpg";//生成图路径
$srcwidth="636";//原图宽度
$srcheight="592";//原图高度
$persentage=0.5;//缩放比例
/*获得新图大小信息*/
$NewWidth=ceil($srcwidth*$persentage);//大小进一取整 宽
$NewHeight=ceil($srcheight*$persentage);//新图高
$New_Image=imagecreatetruecolor($NewWidth,$NewHeight);//创建新图画布
$Image=imagecreatefromjpef($sourceFile);//载入原图
/**等比缩放,获得图像**/
imagecopyresampled($New_Image,$Image,0,0,0,0,$NewWidth,$NewHeight,$srcwidth,$srcheight);
/**输出图像**/
imagejpeg($New_Image,$sourceNew);
imagedestroy($NewHeight_Image,Image);//从内存中清除资源
?>

有的同学要说,难道我每次都要打开图片获得长宽写入程序么?当然不是,我们有imagesize();函数,它能返回一个关于图片大小,图片格式信息的数组print_r();打印下看看吧。

水印功能实现过程:

实现过程,先载入图像,然后通过imagettfbbox();函数计算当使用“内容字体,倾斜角,大小”时候所需要的虚拟文本框大小。之后通过imagettftext();函数向其中X,Y坐标点写入文字。

<?php
$size=20;
$angle=0;
$fontfile="simpo.ttf";//trutype字体文件路径
$text="www.cyanprobe.com";
$file_name="1.jpg";
$img=imagecreatefromjpeg($file_name);//载入图像
$white=imagecolorallocate($img,255,255,255);//分配颜色
$arr=imagettfbbox($size,$angle,$fontfile,$text);//计算虚拟文本像素区域数组
$width=arr[2]-arr[6];
$height=arr[7]-arr[3];
$x=100;$y=100;//水印位置
imagettftext($size,$angle,$fontfile,$x,$y,$text,$white);
imagejpeg($img,"new.jpg");
imagedestroy($img);
?>

imagettfbbox() 返回一个含有 8 个单元的数组表示了文本外框的四个角:

0 左下角 X 位置
1 左下角 Y 位置
2 右下角 X 位置
3 右下角 Y 位置
4 右上角 X 位置
5 右上角 Y 位置
6 左上角 X 位置
7 左上角 Y 位置

看到imagettfbbox();数组返回的value意义,很好理解长宽怎么计算了吧,干脆背下来width=key:
2-6 height=key:7-3 PS:因为是十字坐标,所以存在负值。

后记:

家里蚊子好多的说,受不了了,洗洗睡了,敲了半天键盘。最近感觉学的东西都忘干净了,没时间练笔,打工的生活,干活睡觉,干活睡觉……好似上班挨到大限,很纠结。


CyanProbe , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:GD函数库(三)—等比缩放及水印实现
喜欢 (2)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(2)个小伙伴在吐槽
  1. 天天都在学习啊
    宋稳2015-07-19 18:14 回复