PHP核心编程-图像操作
一 图像操作环境:
1. 开启GD2图像处理并检测
在php.ini开启GD库
2. 画布坐标系说明
二. 图像基本操作(步骤)
1. 创建图像
创建画布(图像资源)
创建的方法:
方法一: 创建真彩色图像
方法二: 基于现有图像创建
2. 绘制图像
如:将字符或汉字写入图像,缩略图,水印图像…..
3. 输出图像
生成的图像在哪个地方显示.
两个地方
1.通过浏览器来显示
Header(‘content-type:image/jpeg’); //设置让浏览器显示图像
Imagejpeg(图像资源); //将图像资源输出
2.图像以文件的形式在操作系统中显示.
Imagejpeg(图像资源,’文件名.jpg’);
如: Imagejpeg(图像资源,’1.jpg’)
4. 销毁图像
将图像资源销毁,目的释放内存.
Imagedestroy(图像资源); //当前页面有多少图像资源就销毁多少.
方法一:创建图片资源生成验证码:
- <?php
- // 第一步:创建图像资源
- // 方法一:创建真彩色图像
- // imagecreatetruecolor(width, height); 单位是像素
- $image = imagecreatetruecolor(100, 30);
- // 分配颜色
- // imagecolorallocate(图像资源, red, green, blue);RGB,取值0~255
- $bgcolor = imagecolorallocate($image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
- // imagesx($image); //获取画布的宽度
- // imagesy($image); //获取画布的高度
- // 填充背景
- // imagefill(图像资源,x,y,用什么颜色填充背景); x,y是填充的坐标
- imagefill($image,0,0,$bgcolor);
- // 第二步:图像绘制
- /*
- 绘制图像(建议)的操作方法
- 1.首先将核心的函数(形参)写出来,然后在个形参前加$符号
- 2.在调用函数之前,对个形参从左到右一个一个进行设置
- */
- // 在图片中写入字符串
- // font 字符串的大小 , x,y 写入时的坐标 string 写入的字符串 color 文字颜色
- $font = 5; //1~5
- // 验证码开始
- $str = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890';
- $string = substr(str_shuffle($str),0,5); //打乱字符 截取5个字符
- // 验证码结束
- // $string = 'helloworld'; //注意:不支持汉字
- /*
- 字符水平坐标
- 字符水平坐标 = (画布宽度-所有字符的宽度和)/2
- 字符水平坐标 = (300-所有字符的宽度和)/2
- 字符水平坐标 = (300-一个字符宽度 * 字符个数)/2
- 字符水平坐标 = (300-imagefontwidth($font) * 字符个数)/2
- 字符水平坐标 = (300-imagefontwidth($font) * strlen($string))/2
- */
- $x = ( imagesx($image)-imagefontwidth($font) * strlen($string))/2;
- /*字符的垂直方向
- (画布的高度 - 一个字符的高度)/2
- (200-一个字符的高度)/2 */
- $y = ( imagesy($image)-imagefontheight($font))/2;
- $color = imagecolorallocate($image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
- imagestring($image, $font, $x, $y, $string, $color);
- // mt_rand(min,max); 产生随机数
- // 加入干扰线
- for ($i=0; $i <15 ; $i++) {
- $linecolor = imagecolorallocate($image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
- imageline($image,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100),mt_rand(0,50),$linecolor);
- }
- // 加入干扰像素点
- for ($i=0; $i <100 ; $i++) {
- $pixcolor = imagecolorallocate($image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
- imagesetpixel($image, mt_rand(0,50), mt_rand(0,50), $pixcolor);
- }
- /*// 画圆,弧
- $cx = 100;
- $cy = 100;
- $width = 150;
- $height = 150;
- $start = 0;
- $end = 360;
- $color = imagecolorallocate($image,0,255,255);
- // cx,cy 圆形的坐标, width,height 长轴,短轴 start,end 弧的开始和结束的角度,默认开始的是3点钟方向,顺序是顺时针 color线的颜色
- imagearc($image, $cx, $cy,$width, $height, $start, $end, $color);*/
- /*//画矩形
- // x1,y1 左上角坐标 X2,y2 右下角坐标
- // imagerectangle(image, x1, y1, x2, y2, color);
- $x1 = 20;
- $y1 = 20;
- $x2 = 150;
- $y2 = 150;
- $color = imagecolorallocate($image,0,0,255);
- imagerectangle($image, $x1, $y1, $x2, $y2, $color);*/
- /*// 画一条直线
- $x1 = 0;
- $y1 = 0;
- $x2 = 100;
- $y2 = 100;
- $color = imagecolorallocate($image,0,255,0); //红线
- // 调用函数
- // imageline(图像资源,x1,y1,x2,y2,线的颜色);
- imageline($image,$x1,$y1,$x2,$y2,$color);
- */
- // 方法二:基于现有的图像
- // 第三步:输出图像
- // 1.通过浏览器来显示
- // header('content-type:image/jpeg');
- header('content-type:image/png');
- // imagejpeg(图像资源);
- imagejpeg($image);
- // 2.生成单独文件
- // imagejpeg($image,'1.jpg');
- // 第四步:销毁图像
- // imagedestroy(图像资源);
- imagedestroy($image);
方法二: 基于现有的图像生成的验证码:
- <?php
- // 第一步:创建图像资源
- // 方法二:基于现有的图像
- $filename = './sucai/code.png';
- $image = imagecreatefrompng($filename);
- // 第二步:图像绘制
- // 将TTF文字字符写入图像
- // size 字符大小 angle旋转的角度 x,y写入的坐标 color字符颜色 fontfile字体路径 text准备写入的字符
- $size = 20;
- $angle = 0;
- $x = 12;
- $y = 25;
- $color = imagecolorallocate($image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
- $fontfile = './sucai/Candarai.ttf';
- // 验证码开始
- $str = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890';
- $text = substr(str_shuffle($str),0,5); //打乱字符 截取5个字符
- // 验证码结束
- // $text = '中国江南皮鞋厂专属水印';
- imagettftext($image, $size, $angle, $x, $y, $color, $fontfile, $text);
- // 第三步:输出图像
- // 1.通过浏览器来显示
- // header('content-type:image/jpeg');
- header('content-type:image/png');
- // imagejpeg(图像资源);
- imagejpeg($image);
- // 2.生成单独文件
- // imagejpeg($image,'1.jpg');
- // 第四步:销毁图像
- // imagedestroy(图像资源);
- imagedestroy($image);
五.创建方法:
注意:
1. 方法一: 创建一个真彩色图像
创建一个真彩色图像 (空画布)
为真彩色图像: 分配颜色
为真彩色图像: 填充颜色
注意:
(1) 实例:输出字符串图像,让文本居于图像的正中
(2)实例:随机验证码,随机验证码居中
(3) 实例:加入干扰元素,点与线
2. 方法二: 创建图像(基于现有图像)
Imagecreatefromjpeg(图像路径);
Imagecreatefrompng(图像路径);
Imagecreatefromgif(图像路径);
通过: getimagesize()获取图像信息:
取得图像的宽度和高度
取得字体的宽度和高度
(1) 在图像上写入TTF字体的文本(支持汉字)
imagettftext(image, size, angle, x, y, color, fontfile, text);
1.size //字符大小,没有限制
2.angle //旋转的角度
3.x,y 写入坐标
4.color //字符颜色
5.fontfile //字体的路径
6.text //准备写入的字符
2) 实例:TTF字体的文本
(2) 实例:基于现有图像生成TTF验证码
(3)实例:将验证码植入到表单中
验证码code.php
- <?php
- session_start();
- // 第一步:创建图像资源
- // 方法二:基于现有的图像
- $filename = './sucai/code.png';
- $image = imagecreatefrompng($filename);
- // 第二步:图像绘制
- // 将TTF文字字符写入图像
- // size 字符大小 angle旋转的角度 x,y写入的坐标 color字符颜色 fontfile字体路径 text准备写入的字符
- $size = 20;
- $angle = 0;
- $x = 12;
- $y = 25;
- $color = imagecolorallocate($image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
- $fontfile = './sucai/Candarai.ttf';
- // 验证码开始
- $str = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890';
- $text = substr(str_shuffle($str),0,5); //打乱字符 截取5个字符
- // 将验证码写入session
- $_SESSION['checkcode'] = $text;
- // 验证码结束
- // $text = '中国江南皮鞋厂专属水印';
- imagettftext($image, $size, $angle, $x, $y, $color, $fontfile, $text);
- // 第三步:输出图像
- // 1.通过浏览器来显示
- // header('content-type:image/jpeg');
- header('content-type:image/png');
- // imagejpeg(图像资源);
- imagejpeg($image);
- // 2.生成单独文件
- // imagejpeg($image,'1.jpg');
- // 第四步:销毁图像
- // imagedestroy(图像资源);
- imagedestroy($image);
(4)通过session对验证码,进行验证
(5)实例:制作图像文字水印效果
(6)实例:上传图片并加入水印文字
1.上传页面: index.php
2.处理页面:upload.php
续上面的代码
(7)实例:生成缩略图
imagecopyresampled(dst_image, src_image, dst_x, dst_y, src_x, src_y, dst_w, dst_h, src_w, src_h)
输出目标图像:缩略图
说明:
Dst_image //目标图像资源
Src_image//源图像资源
Dst_x,dst_y //目标图像取样坐标
Src_x,src_y //源图像的取样坐标
//以上四个坐标都使用0. 等比缩小.
Dst_w,dst_h //目标图像的宽和高
Src_w,src_h //源图像的宽和高
- <?php
- // 第一步:创建图像资源
- // 方法二:基于现有的图像
- $src_file = './sucai/1.jpg';
- $src_image = imagecreatefromjpeg($filename);
- //imagesx($src_image); //获取画布宽度
- //imagesy($src_image); //获取画布高度
- // getimagesize($src_image);
- // list 可以取得数组对应下标的值
- list($src_w,$src_h)= getimagesize($src_file);
- $per = 0.5;
- // 目标宽高
- $dst_w = $per * $src_w;
- $dst_h = $per * $src_h;
- $dst_image = imagecreatetruecolor($dst_w,$dst_h);
- // 第二步:图像绘制
- //缩略图,将大图等比缩小图
- imagecopyresampled($dst_image, $src_image, 0, 0, 0, 0, $dst_w, $dst_h, $src_w, $src_h) ;
- // imagecopyresized(dst_image, src_image, dst_x, dst_y, src_x, src_y, dst_w, dst_h, src_w, src_h);
- // 第三步:输出图像
- // 1.通过浏览器来显示
- // header('content-type:image/jpeg');
- header('content-type:image/jpeg');
- // imagejpeg(图像资源);
- imagejpeg($dst_image);
- // 2.生成单独文件
- // imagejpeg($image,'1.jpg');
- // 第四步:销毁图像
- // imagedestroy(图像资源);
- imagedestroy($dst_image);
- imagedestroy($src_image);
(8)实例:制作图像图片水印效果
imagecopymerge(dst_im, src_im, dst_x, dst_y, src_x, src_y, src_w, src_h, pct)
输出目标图像,源图像一般设置为logo小图.
说明:
dst_im //大图资源
Src_im //小图资源logo
src_x,src_y //小图的左角坐标
dst_x ,dst_y //小图左上角这个点在大图中的坐标
src_w,src_h //小图的宽与高
pct //小图的透明度0-100
- <?php
- //第一步: 创建图像
- //方法二: 基于现有的图像
- $dst_file = './sucai/1.jpg'; //大图
- $src_file = './sucai/logo.gif'; //小图
- //目标资源,大图
- $dst_im = imagecreatefromjpeg($dst_file);
- //源资源logo
- $src_im = imagecreatefromgif($src_file);
- //获取源logo的宽与高
- list($src_w, $src_h ) = getimagesize($src_file);
- list($dst_w, $dst_h ) = getimagesize($dst_file);
- // imagesx($src_image); //获取画布的宽度
- // imagesy($src_image); //获取画布的高度
- //list — 把数组中的值赋给一些变量
- /*echo "<pre>";
- print_r(getimagesize($src_file));
- echo "</pre>";
- echo "<hr>";
- die;*/
- //list($src_w,$src_h) = getimagesize($src_file);
- $dst_x = ($dst_w - $src_w)/2;
- $dst_y = ($dst_h - $src_h)/2;
- $src_x = 0;
- $src_y = 0;
- $pct = 50; //0-100
- imagecopymerge($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct);
- //第三步: 输出图像
- header('content-type:image/jpeg');
- //imagejpeg(图像资源);
- imagejpeg($dst_im);
- //第四步: 销毁图像
- //imagedestroy(图像资源);
- imagedestroy($dst_im);
- imagedestroy($src_im);
- ?>
PHP核心编程-图像操作的更多相关文章
- PHP核心编程--目录操作(包含文件操作)
一.目录操作 1. 创建目录 创建目录mkdir(目录名称) //返回值为布尔 一次性创建主目录及其子目录 判断是不是一个目录is_dir //返回true,false 判断目录或文件是否存 ...
- 使用同步或异步的方式完成 I/O 访问和操作(Windows核心编程)
0x01 Windows 中对文件的底层操作 Windows 为了方便开发人员操作 I/O 设备(这些设备包括套接字.管道.文件.串口.目录等),对这些设备的差异进行了隐藏,所以开发人员在使用这些设备 ...
- CreateThread 线程操作与 _beginthreadex 线程安全(Windows核心编程)
0x01 线程的创建 线程不同于进程,Windows 中的进程是拥有 '惰性' 的,本身并不执行任何代码,而执行代码的任务转交给主线程,列如使用 CreateProcess 创建一个进程打开 Cmd ...
- Qt on Android 核心编程
Qt on Android 核心编程(最好看的Qt编程书!CSDN博主foruok倾力奉献!) 安晓辉 著 ISBN 978-7-121-24457-5 2015年1月出版 定价:65.00元 4 ...
- windows核心编程 - 线程同步机制
线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...
- windows核心编程---第九章 同步设备IO与异步设备IO之同步IO
同步设备IO 所谓同步IO是指线程在发起IO请求后会被挂起,IO完成后继续执行. 异步IO是指:线程发起IO请求后并不会挂起而是继续执行.IO完毕后会得到设备的通知.而IO完成端口就是实现这种通知的很 ...
- windows核心编程---第八章 使用内核对象进行线程同步
使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...
- windows核心编程---第二章 字符和字符串处理
使用vc编程时项目-->属性-->常规栏下我们可以设置项目字符集合,它可以是ANSI(多字节)字符集,也可以是unicode字符集.一般情况下说Unicode都是指UTF-16.也 ...
- Python核心编程-描述符
python中,什么描述符.描述符就是实现了"__get__"."__set__"或"__delete__" 方法中至少一个的对象.什么是非 ...
随机推荐
- 联想 Z470个人安装黑苹果参考
笔记本是联想 Z470,cpu i3-2350M 傻瓜图文式]Win系统下制作U盘CLOVER引导 EDIT部分 进去黑屏 U盘引导盘
- 阿里云“网红"运维工程师白金:做一个平凡的圆梦人
他是阿里云的一位 P8 运维专家,却很有野心得给自己取花名“辟拾(P10)”:他没有华丽的履历,仅凭着 26 年的热爱与坚持,一步一个脚印踏出了属于自己的技术逆袭之路:他爱好清奇,练就了能在 20 秒 ...
- 左神算法书籍《程序员代码面试指南》——1_10最大值减去最小值小于或等于num的子数组数量
[题目]给定数组arr和整数num,共返回有多少个子数组满足如下情况:max(arr[i.j]) - min(arr[i.j]) <= num max(arfi.j])表示子数组ar[ij]中的 ...
- Java学习笔记 - 类方法与代码块的执行顺序
类的初始化顺序 使用一个简单的父子类例子来做示范,代码执行顺序在代码后有标注. class Parent { public static String p_StaticField = "父类 ...
- [原创]最优化/Optimization文章合集
转载请注明出处:https://www.codelast.com/ 最优化(Optimization)是应用数学的一个分支,它是研究在给定约束之下如何寻求某些因素(的量),以使某一(或某些)指标达到最 ...
- python 与 selenium 学习笔记
在写自动运行测试用例,并且生成HTML报告的时候,遇到了这个报错: UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in positi ...
- Redis源码解析:11RDB持久化
Redis的RDB持久化的相关功能主要是在src/rdb.c中实现的.RDB文件是具有一定编码格式的数据文件,因此src/rdb.c中大部分代码都是处理数据格式的问题. 一:RDB文件格式 上图就是一 ...
- Echarts 的简单使用
http://echarts.baidu.com/index.html 直接用script引入从官网下载的echarts.js文件 官网的文件有几种版本的,按需下载即可,注意精简版的只显示折线.圆柱等 ...
- 前端插件--swipe.js
swipe.js的作用: 这是一个轻量级的移动滑动组件,支持触摸移动,支持响应式页面. 效果图: 代码: <!DOCTYPE html> <html lang="en&qu ...
- 在多版本python的pip的安装与对应包的安装
最近花了好长时间在搞这个,由于Deepin下python有两个版本,并且都没有安装pip,之前的博文默认安装pip给python2.7,结果各种问题,在此将之前走过的弯路整合起来: 首先,安装pip ...