• 首页
  • 前端
    • HTML
    • CSS
    • Javascript
    • XML
    • AJAX
  • 前端框架
    • BootStrap
    • Jquery
  • PHP
    • 语法
    • 核心
    • 面向对象
    • PHP7
    • Socket
    • Swoole
  • 数据库
    • Mysql
    • Redis
    • Memcache
    • MongoDB
  • 优化
    • 优化方案
    • 页面静态化
    • Nginx
  • 后台框架与实战
    • Smarty
    • 源码Blog
    • TP3.2
    • TP3.2商城
    • TP5.0
    • TP5.0商城
    • Laravel
    • Laravel在线教育平台
    • Yii
    • Yii手机直播
    • CodeIgniter
    • Yaf
  • 移动开发
    • 微信公众号
    • 混合APP
  • 二次开发
    • DedeCMS
  • Linux
    • 基本操作
    • 环境搭建
  • 版本控制
    • GIT
    • SVN
  • Node.js
  • 资料库
没有结果
查看所有结果
  • 首页
  • 前端
    • HTML
    • CSS
    • Javascript
    • XML
    • AJAX
  • 前端框架
    • BootStrap
    • Jquery
  • PHP
    • 语法
    • 核心
    • 面向对象
    • PHP7
    • Socket
    • Swoole
  • 数据库
    • Mysql
    • Redis
    • Memcache
    • MongoDB
  • 优化
    • 优化方案
    • 页面静态化
    • Nginx
  • 后台框架与实战
    • Smarty
    • 源码Blog
    • TP3.2
    • TP3.2商城
    • TP5.0
    • TP5.0商城
    • Laravel
    • Laravel在线教育平台
    • Yii
    • Yii手机直播
    • CodeIgniter
    • Yaf
  • 移动开发
    • 微信公众号
    • 混合APP
  • 二次开发
    • DedeCMS
  • Linux
    • 基本操作
    • 环境搭建
  • 版本控制
    • GIT
    • SVN
  • Node.js
  • 资料库
没有结果
查看所有结果
没有结果
查看所有结果

PHP 核心编程(五)GD 库、 图片颜色填充、 水印、 缩略图、 验证码

Mr.Lee 由 Mr.Lee
2018年5月18日
在 PHP核心编程
0
PHP 核心编程(一)文件上传、 表单传值、 验证文件类型
0
分享
3
浏览

GD图像处理

GD库简介

GD库是专门做图像处理的。比如验证码,缩略图,图片水印等效果



PHP操作GD库的原理

第一步:创建图片资源

第二步:对图片进行操作

第三步:输出图片资源

第四步:销毁图片资源

引入GD库

默认情况下,PHP不支持对图片的处理,必须引入GD扩展才能实现对图片的操作

开启GD库后,以image开头的函数都可以使用了。

创建图片

知识点

  1. imagecreate():创建图片资源
  2. imagecolorallocate():给图片资源分配一个颜色
  3. imagejpeg():图片按jpeg格式显示或保存
  4. imagegif():图片按gif格式显示或保存
  5. imagepng():图片按png格式显示或保存
  6. imagedestroy():销毁图片

代码

脚下留心:如果图片保存就不需要写header().

imagecolorallocate()

给图片分配颜色,默认第一个分配的颜色是背景色,返回的是颜色的编号

返回的是颜色的索引编号

画图

直线

例题

矩形

代码

圆弧

例题1

例题2

例题3

曲线

曲线是由多个像素点组成,画曲线就是画许多像素点

例题

验证码

验证码可以防止暴力破解,通过排列组合的方式破解用户名和密码。

验证码由背景图和随机数组成

知识点

  1. imagestring()

  1. 字符串居中

    1. Imagesx():获取图片宽度
    2. Imagesy():获取图片高度
    3. Imagefontwidth():获取图片内置字体的宽度
    4. Imagefontheight():获取图片内置字体的高度

代码

<?php

//第一步:生成随机字符串

$char_array=array_merge(range(‘a’,’z’),range(‘A’,’Z’),range(0,9)); //字母和数字的数组

$indexes=array_rand($char_array,4); //随机抽取4个字符,返回字符下标数组

shuffle($indexes); //打乱数组

$str=”;

foreach($indexes as $i) {

$str.=$char_array[$i];

}

//第二步:将字符串写到背景图

$img=imagecreate(200,100);

imagecolorallocate($img,255,0,0); //背景色

$color=imagecolorallocate($img,255,255,255); //前景色

$img_w=imagesx($img); //图片宽度

$img_h=imagesy($img); //图片高度

$font=5; //内置的5号字体

$font_w=imagefontwidth($font); //字符宽度

$font_h=imagefontheight($font); //字符高度

$x=($img_w-$font_w*strlen($str))/2; //起始点x坐标

$y=($img_h-$font_h)/2; //起始点y坐标

imagestring($img,$font,$x,$y,$str,$color); //将字符串写到图片上

//输出图片

header(‘Content-Type:image/png’);

imagepng($img);

运行结果

中文验证码

Imagestring()不能做中文的验证码,要使用中文做验证码需要使用imagettftext()。

将字体拷贝到站点下

知识点

获取字体的范围

返回值

代码

基线

代码

<?php

$img=imagecreate(200,100);

imagecolorallocate($img,255,0,0); //背景色

$color=imagecolorallocate($img,255,255,255); //前景色

//生成随机中文字符串

$char_array=[‘锄’,’禾’,’日’,’当’,’午’,’汗’,’滴’,’禾’,’下’,’土’,’我’,’爱’,’北’,’京’,’天’,’安’,’门’];

$indexes=array_rand($char_array,4); //随机抽取4个字符,返回字符下标数组

shuffle($indexes); //打乱数组

$str=”;

foreach($indexes as $i) {

$str.=$char_array[$i];

}

//字体参数

$size=20; //字号

$angle=0; //角度

$fontfile=’./fonts/simhei.ttf’; //字体

//获取字体范围

$info=imagettfbbox($size,$angle,$fontfile,$str); //返回字符串的4个角的坐标4

$x=(imagesx($img)-($info[4]-$info[6]))/2; //起始X轴

$y=imagesy($img)/2+($info[1]-$info[7])/3; //起始y轴(字体基线的位置,不是字符的最底端。)

//将中文写到图片上

imagettftext($img,$size,$angle,$x,$y,$color,$fontfile,$str);

//输出图片

header(‘Content-Type:image/png’);

imagepng($img);

运行结果

打开已有图片实现验证码

打开已经存在的图片创建画布

  1. imagecreatefromgif():打开gif图创建画布
  2. imagecreatefromjpeg():打开jpeg图创建画布
  3. imagecreatefrompng():打开png图创建画布

代码

<?php

//第一步:生成随机字符串

$char_array=array_merge(range(‘a’,’z’),range(‘A’,’Z’),range(0,9)); //字母和数字的数组

$indexes=array_rand($char_array,4); //随机抽取4个字符,返回字符下标数组

shuffle($indexes); //打乱数组

$str=”;

foreach($indexes as $i) {

$str.=$char_array[$i];

}

//第二步:将字符串写到图片上

$path=’./captcha/captcha_bg’.rand(1,5).’.jpg’; //图片路径

$img=imagecreatefromjpeg($path); //打开已经存在的jpeg图

$color=imagecolorallocate($img,255,0,0); //分配红色

if(rand(1,2)==1) {

$color=imagecolorallocate($img,0,255,100); //分配白色

}

$img_w=imagesx($img); //图片宽度

$img_h=imagesy($img); //图片高度

$font=5; //内置的5号字体

$font_w=imagefontwidth($font); //字符宽度

$font_h=imagefontheight($font); //字符高度

$x=($img_w-$font_w*strlen($str))/2; //起始点x坐标

$y=($img_h-$font_h)/2; //起始点y坐标

imagestring($img,$font,$x,$y,$str,$color); //将字符串写到图片上

//输出图片

header(‘Content-Type:image/png’);

imagepng($img);

运行结果

添加水印

添加水印的目的为了防止被盗图。

添加文字水印

<?php

$img=imagecreatefromjpeg(‘./face.jpg’); //打开原图

$color=imagecolorallocate($img,255,0,0); //分配颜色

//字体参数

$size=40; //字号

$angle=0; //角度

$fontfile=’./fonts/simhei.ttf’; //字体

//获取字体范围

$str=’传智播客版权’;

$info=imagettfbbox($size,$angle,$fontfile,$str); //返回字符串的4个角的坐标4

$x=imagesx($img)-($info[4]-$info[6]); //起始X轴

$y=imagesy($img)-($info[1]-$info[7])/3; //起始y轴(字体基线的位置,不是字符的最底端。)

//将中文写到图片上

imagettftext($img,$size,$angle,$x,$y,$color,$fontfile,$str);

//输出图片

header(‘Content-Type:image/png’);

imagepng($img);

😎

添加图片水印

代码

生成缩略图

将大图自动的生成小缩略图

原图的参数:起始x,起始y,拷贝宽度,拷贝高度

目标图的参数:目标图x,目标图y,目标宽度,目标高度

使用函数

脚下留心:imagecreatetruecolor()和imagecreate()区别

imagecreatetruecolor()新建一个真彩色图像(RGB模式),默认背景色黑色

imagecreate():新建一个基于调色板的图像,只支持256种颜色,默认背景白色

给图片填充颜色

深入理解imagefill()

例题

关于图片处理的改错

第一:如果报错,就按报错的信息更改

第二:不报错,但是图片显示不出来

注释header(),查看错误

第三:注释header()如果没有报错,就查看源码


第三:终极一招,ob_clean()

如果上面的方法都没有效果,可以尝试ob_clean()

原理:图片输出之前不能有任何字符的输出,ob_clean()情况缓存中所有输出。

思考题

制作等比缩略图

标签: GD 库图片颜色填充水印缩略图验证码
上一篇文章

Mysql(一)关系型、 层次型、 数据库、 数据库引擎、 数据表、 网状型、 表属性

下一篇文章

PHP 核心编程(四)Cookie、 Session、 响应头、 短连接、 请求头、 长链接

下一篇文章
PHP 核心编程(一)文件上传、 表单传值、 验证文件类型

PHP 核心编程(四)Cookie、 Session、 响应头、 短连接、 请求头、 长链接

发表回复 取消回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Search

没有结果
查看所有结果

About Me

个人随笔

Winston Lee

Programmer

Hello & welcome to my blog! My name is Winston Lee and am a programmer and am keen on sharing.

Winston Lee

About Me

Hello & welcome to my blog! My name is Winston Lee and am a programmer and am keen on sharing.

Categories

  • AJAX
  • BootStrap
  • CodeIgniter
  • CSS
  • DedeCMS
  • GIT
  • HTML
  • Javascript
  • Jquery
  • Laravel
  • Laravel在线教育平台
  • Linux
  • Memcache
  • MongoDB
  • MVC
  • Mysql
  • Nginx
  • Node
  • PDO
  • PHP
  • PHP7
  • PHP基本语法
  • PHP核心编程
  • Redis
  • Smarty
  • Socket
  • SVN
  • Swoole
  • TP3.2
  • TP3.2商城
  • TP5.0
  • TP5.0商城
  • XML
  • Yaf
  • Yii
  • Yii手机直播
  • 二次开发
  • 优化方案
  • 前端技术
  • 前端框架
  • 后台框架
  • 基本操作
  • 微信公众号
  • 数据库
  • 未分类
  • 混合APP
  • 源码Blog项目
  • 版本控制
  • 环境搭建
  • 移动端开发
  • 网站优化
  • 资料
  • 面向对象
  • 面向对象编程
  • 页面静态化

Tags

DOM Json RBAC 事件 传参 函数 分页 判断语句 匿名函数 变量 图片上传 存储过程 安装 对象 封装 属性 接口 控制器 数据库操作 数据类型 数据表 数组 文件上传 无刷新分页 权限 标签 模型 正则 流程控制 目录结构 算法 类 索引 继承 缩略图 表关系 视图 路由 运算符 选择器 递归 配置 错误处理 页面静态化 验证码
  • 首页
  • 前端
  • 前端框架
  • PHP
  • 数据库
  • 优化
  • 后台框架与实战
  • 移动开发
  • 二次开发
  • Linux
  • 版本控制
  • Node.js
  • 资料库

沪公网安备31011502400873 | 沪ICP备2024050435号-3

没有结果
查看所有结果
  • 首页
  • 前端
    • HTML
    • CSS
    • Javascript
    • XML
    • AJAX
  • 前端框架
    • BootStrap
    • Jquery
  • PHP
    • 语法
    • 核心
    • 面向对象
    • PHP7
    • Socket
    • Swoole
  • 数据库
    • Mysql
    • Redis
    • Memcache
    • MongoDB
  • 优化
    • 优化方案
    • 页面静态化
    • Nginx
  • 后台框架与实战
    • Smarty
    • 源码Blog
    • TP3.2
    • TP3.2商城
    • TP5.0
    • TP5.0商城
    • Laravel
    • Laravel在线教育平台
    • Yii
    • Yii手机直播
    • CodeIgniter
    • Yaf
  • 移动开发
    • 微信公众号
    • 混合APP
  • 二次开发
    • DedeCMS
  • Linux
    • 基本操作
    • 环境搭建
  • 版本控制
    • GIT
    • SVN
  • Node.js
  • 资料库

沪公网安备31011502400873 | 沪ICP备2024050435号-3