gd库注意事项

对于乱码问题

在php里面包含

header("content-type:image/png");

这样输出的图像就不会乱码了后面跟的Png也可以改变为自己想要输出的图像格式,在这个时候如果var_dump();那么就会出错误,因为输出的是图片格式,需要用到var_dump()的时候注释掉就可以了。

关于图像的画布创建

imageCreateTrueColor(height,weidth);//创建画布设置宽高

创建颜色对象

imageColorAllocate(img_resource,r,g,b);//设置画布的颜色

填充画布背景颜色

imageFill(img_resource,x,y,color);

(x,y)表示从哪里开始填充颜色不写的话默认是黑色的

出现的问题:在设置起始填充位置时如果超出画布大小则会以默认颜色填充

绘制矩形

空心

imagerectangle(img_resource,x1,y1,x2,y2,color);

x1,y1左上角

x2,y2右下角

实心

imagefilledrectangle(img_resource,x1,y1,x2,y2,color);

绘制圆形

空心

imageellipse(img_resource,x,y,圆形的上下长,圆形的左右长,color);

x,y表示的圆心位置

实心

imagefilledellipse(img_resource,x,y,圆形的上下长,圆形的左右长,color);

绘制线条

imageline(img_resource,x1,y1,x2,y2,color)

x1,y1起始位置坐标

x2,y2终点位置坐标

设置绘制线条的宽度

imagesetthickness(img_resource,width);//设置绘制线条的宽度

在绘制某一图形之前设置

要绘制两个宽度不一样的线条,案例如下

imagesetthickness($im,20);
imageline($im,0,0,500,500,$blue);
imagesetthickness($im,10);
imageline($im,0,500,500,0,$blue);

这样,两条线就得到了不同的宽度

设置填充的样式

imagesetstyle($im,[$red,$blue,$green]);

一样在绘制前设定上面的案例指的是填充的是三色交替的样子,设置完之后要想看到效果,

imageline(img_resource,x1,y1,x2,y2,IMG_COLOR_STYLED)//颜色资源要改成这个常量IMG_COLOR_STYLED

画一个点(实用性一般用于对验证码产生干扰点防止一些软件识别验证码)

imagesetpixel($im,x,y,color);

案例如下

<?php
header('Content-type:image/JPG');//设置输出的图像格式
$im = imagecreatetruecolor(500,500);//创建画布
$red=imageColorAllocate($im,225,0,0);//创建颜色对象
$green = imagecolorallocate($im, 0,225,0);
$blue = imagecolorallocate($im, 0,0,225);
$white=imagecolorallocate($im, 255,255,225);
imageFill($im,0,0,$white);//画布背景填充颜色,默认黑色
imagesetpixel($im,250,250,$red);
for($i=0;$i<1000;$i++){
imagesetpixel($im,mt_rand(0,500),mt_rand(0,500),$red);//此处细节,mt_rand();性能高与rand();
}
imagepng($im);
?>

同理把绘制点改为线就能出线干扰线,有兴趣的可以试试我下面的代码跑着玩,每刷新一次又出现新的线条,很有意思的

<?php
header('Content-type:image/JPG');//设置输出的图像格式
$im = imagecreatetruecolor(500,500);//创建画布
$red=imageColorAllocate($im,225,mt_rand(0,255),0);//创建颜色对象
$green = imagecolorallocate($im, 0,225,0);
$blue = imagecolorallocate($im, 0,0,225);
$white=imagecolorallocate($im, 255,255,225);
imageFill($im,0,0,$white);//画布背景填充颜色,默认黑色
imagesetpixel($im,250,250,$red);
for($i=0;$i<100;$i++){
imagesetthickness($im,mt_rand(0,50));
$red=imageColorAllocate($im,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));//创建颜色对象
imageline($im,mt_rand(0,500),mt_rand(0,500),mt_rand(0,500),mt_rand(0,500),$red);
}
imagepng($im);
?>

图像的保存和显示

显示我们已经用到过了的

imagepng($im);//在浏览器显示资源
imagepng($im,'文件名.png');//保存资源,路径在和代码所在位置同一路径

结束后记得清理内存,图像会占用内存

imagedestroy($im);//操作完成后清理内存

显示文字在图像中(主要应用与验证码)

imagettftext($im,size,angle,x,y,color,$font,$text);

size:字体大小,angle:角度,起始打印位置(x,y),颜色color,font:字体资源路径,text文字内容

案例如下

<?php
header('Content-type:image/JPG');//设置输出的图像格式
$im = imagecreatetruecolor(500,500);//创建画布
$red=imageColorAllocate($im,225,0,0);//创建颜色对象
$green = imagecolorallocate($im, 0,225,0);
$blue = imagecolorallocate($im, 0,0,225);
$white=imagecolorallocate($im, 255,255,225);
imageFill($im,0,0,$white);//画布背景填充颜色,默认黑色
$font="c:/windows/fonts/simhei.ttf";//设置字体路径,我用的是windos自带的字体
$text='hello';//设置文本内容
for($i=0;$i<mb_strlen($text,'utf-8');$i++)//这里mb_strlen($text,'utf-8')这里是为了中文的输出,按中文计算
//字符串长度
{
$color=imageColorAllocate($im,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));//创建随机的颜色对象
imagettftext($im,20,mt_rand(-80,80),20+20*$i,mt_rand(20,30),$color,$font,mb_substr($text,$i,1,'utf-8'));//这里的mb_substr同样是为了中文的输出
}
imagepng($im);
imagedestroy($im);
?>

mb_substr( $str, $start, $length, $encoding )

$str,需要截断的字符串

$start,截断开始处,起始处为0

$length,要截取的字数

$encoding,网页编码,如utf-8,GB2312,GBK

文本盒子的概念(实用性,指定位置打水印)

能够装下文字的盒子

 imagettfbbox ($size,$angle,$fontfile,$text)
imagettfbbox() 返回一个含有 8 个单元的数组表示了文本外框的四个角:
0 左下角 X 位置
1 左下角 Y 位置
2 右下角 X 位置
3 右下角 Y 位置
4 右上角 X 位置
5 右上角 Y 位置
6 左上角 X 位置
7 左上角 Y 位置

知道了四个角的坐标点我们就可以来求出文本所占的宽高,从而控制文字所在位置

<?php
header('Content-type:image/JPG');//设置输出的图像格式
$im = imagecreatetruecolor(500,500);//创建画布
$red=imageColorAllocate($im,225,0,0);//创建颜色对象
$green = imagecolorallocate($im, 0,225,0);
$blue = imagecolorallocate($im, 0,0,225);
$white=imagecolorallocate($im, 255,255,225);
imageFill($im,0,0,$white);//画布背景填充颜色,默认黑色
$font="c:/windows/fonts/simhei.ttf";
$text='我爱你亲爱的姑娘';
$size=30;
$box=imagettfbbox($size,0,$font,$text);
$width=$box[2]-$box[0];
$height=$box[1]-$box[7];
imagettftext($im,$size,0,250-$width/2,250,$red,$font,$text);
imagepng($im);
imagedestroy($im);
?>

gd库的相关内容的更多相关文章

  1. php使用gd库输出中文内容的图片

    正如标题所说那样,本文只讨论输出内容全部为中文或者包含中文的情况.如果内容全是字母或者其他字符的话,可以参考这篇博客:生成验证码 问题 此处要注意,标题中为什么要区别windows和linux分别实现 ...

  2. 解决PHP开启gd库无效的问题

    最近需要重新安装PHP,以前一直使用的都是XAMPP,基本上都不需要自己配置,现在准备直接下载官方原版的Apache和PHP,自己来慢慢摸索如何继承配置. 我下载的Apache版本为2.2.25,PH ...

  3. php使用GD库实现图片水印和缩略图——封装成类

    学完了如何使用GD库来实现对图片的各种处理,那么我们可以发现,不管哪种方法,都有相似之处,如果我们把这些相似的地方和不相似的地方都封装成类,这样就可以提升代码的速度,而且节省了很多时间,废话不多说,来 ...

  4. php使用GD库实现图片水印和缩略图——给图片添加文字水印

    今天呢,就来学习一下在php中使用PD库来实现对图片水印的文字水印方法,不需要PS哦! 首先,准备素材 (1)准备一张图片 (2)准备一张水印(最好是透明的,即背景是白色底) (3)准备一中字体(在电 ...

  5. 记一次bypass某场景GD库及拓展分析

    0x00 前言 gou楼兰师傅发来个站说是过不了gd库,问我有啥办法没有,给了他之前海贼师傅说的jpg_payload脚本,但是绕不过,问他拿了站点,写了个jpg_payload批量的fuzz脚本,f ...

  6. 一起学习PHP中GD库的使用(一)

    又到了一个大家非常熟悉的库了,对于图像图形的处理来说,GD 库是 PHPer 们绕不过去的一道坎.从很早很早的 CMS 或者 Discuz 时代,各类开源软件在安装的时候就会明确地指出 GD 库是它们 ...

  7. PHP图形图像处理之初识GD库

    d=====( ̄▽ ̄*)b 引语 php不仅仅局限于html的输出,还可以创建和操作各种各样的图像文件,如GIF.PNG.JPEG.WBMP.XBM等. php还可以将图像流直接显示在浏览器中. 要处 ...

  8. GD库使用小结---2

    接着上一篇.GD库可以折腾很多用法出来,当然得跟画图相关,除了前面的验证码.水印外,还可以进行图片的缩放,裁剪.旋转等操作,这在很多应用中可以见到. 1. 加水印 前面已经知道,我们可以使用image ...

  9. php下安装动态扩展库的相关事项

    php下安装动态扩展库的相关事项 我下载的Apache版本为2.4,PHP版本为7.0. 将Apache与PHP集成配置好后(PHP安装目录为:G:\computer\web\php7,apache安 ...

随机推荐

  1. Mac OS终端利器iTerm2(完美替代bash)

    iTerm2 iTerm一个为Mac OS X编写的,功能齐全的终端仿真程序:目标是在为用户提供OS X下最佳的命令行体验,iTerm 2有很多能够提升效率的实用功能.比如说窗口分割.热键窗口.智能搜 ...

  2. Swap Without Extra Variable

    Given two variables, x and y, swap two variables without using a third variable.   Example Given x = ...

  3. elment-ui的validate

    https://blog.csdn.net/qq469234155/article/details/84034816 validate()时elment-ui封装好的用于对整个表单进行验证valida ...

  4. 国庆集训 Day1 T2 生成图 DP

    国庆集训 Day1 T2 生成图 现在要生成一张\(n\)个点的有向图.要求满足: 1.若有 a->b的边,则有 b->a 的边 2.若有 a->b 的边和 b->c 的边,则 ...

  5. linux系列(十四):head命令

    1.命令格式: head [参数] [文件] 2.命令功能: head 用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行. 3.命令参数: -q 隐藏文件名 -v 显示文件名 ...

  6. JSP+Oracle实现分页功能

    Oracle: create table load( id char(200) not null, title varchar2(100) not null, time varchar2(100) n ...

  7. linux 搭建elk6.8.0集群并破解安装x-pack

    一.环境信息以及安装前准备 1.组件介绍 *Filebeat是一个日志文件托运工具,在你的服务器上安装客户端后,filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停 ...

  8. [APIO2017]商旅——分数优化+floyd+SPFA判负环+二分答案

    题目链接: [APIO2017]商旅 枚举任意两个点$(s,t)$,求出在$s$买入一个物品并在$t$卖出的最大收益. 新建一条从$s$到$t$的边,边权为最大收益,长度为原图从$s$到$t$的最短路 ...

  9. GO 跟C++/C差异

    规范的语法(不需要符号表来解析) 垃圾回收(独有) 无头文件 明确的依赖 无循环依赖 常量只能是数字 int和int32是两种类型 字母大小写设置可见性(letter case sets visibi ...

  10. 2018-2019-2 《网络对抗技术》Exp8 Web基础 Week11-12 20165233

    Exp8 Web基础 目录 一.基础问题 二.实验步骤 实验点一:Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. 实验 ...