一 图像操作环境:

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核心编程-图像操作的更多相关文章

  1. PHP核心编程--目录操作(包含文件操作)

    一.目录操作 1.    创建目录 创建目录mkdir(目录名称)  //返回值为布尔 一次性创建主目录及其子目录 判断是不是一个目录is_dir  //返回true,false 判断目录或文件是否存 ...

  2. 使用同步或异步的方式完成 I/O 访问和操作(Windows核心编程)

    0x01 Windows 中对文件的底层操作 Windows 为了方便开发人员操作 I/O 设备(这些设备包括套接字.管道.文件.串口.目录等),对这些设备的差异进行了隐藏,所以开发人员在使用这些设备 ...

  3. CreateThread 线程操作与 _beginthreadex 线程安全(Windows核心编程)

    0x01 线程的创建 线程不同于进程,Windows 中的进程是拥有 '惰性' 的,本身并不执行任何代码,而执行代码的任务转交给主线程,列如使用 CreateProcess 创建一个进程打开 Cmd ...

  4. Qt on Android 核心编程

    Qt on Android 核心编程(最好看的Qt编程书!CSDN博主foruok倾力奉献!) 安晓辉 著   ISBN 978-7-121-24457-5 2015年1月出版 定价:65.00元 4 ...

  5. windows核心编程 - 线程同步机制

    线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...

  6. windows核心编程---第九章 同步设备IO与异步设备IO之同步IO

    同步设备IO 所谓同步IO是指线程在发起IO请求后会被挂起,IO完成后继续执行. 异步IO是指:线程发起IO请求后并不会挂起而是继续执行.IO完毕后会得到设备的通知.而IO完成端口就是实现这种通知的很 ...

  7. windows核心编程---第八章 使用内核对象进行线程同步

    使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...

  8. windows核心编程---第二章 字符和字符串处理

        使用vc编程时项目-->属性-->常规栏下我们可以设置项目字符集合,它可以是ANSI(多字节)字符集,也可以是unicode字符集.一般情况下说Unicode都是指UTF-16.也 ...

  9. Python核心编程-描述符

    python中,什么描述符.描述符就是实现了"__get__"."__set__"或"__delete__" 方法中至少一个的对象.什么是非 ...

随机推荐

  1. 原生js封装ajax代码

    方法一:(类似jQuery的封装方法) 1.ajax函数封装: /* *author: Ivan *date: 2014.06.01 *参数说明: *opts: {'可选参数'} **method: ...

  2. poj 1958

    传送门 四塔汉诺塔问题,转移方程非常玄学,f[i]=min(f[j]*2+d[i-j]) (1 <=j < i),d表示三塔下的汉诺塔问题,这个方程的意思是将j个在四塔模式下有A挪到B,然 ...

  3. 对json对象进行截取并按照某关键字进行排序

    json对象截取后三个数据,并按照时间的顺序进行倒叙排序. var json = [{"sent_time":"08:29:09","dist&quo ...

  4. idea如何清晰地查看java类的继承结构及该类的所有方法?

    转载自:https://blog.csdn.net/luo609630199/article/details/82192938 我们在世用idea是平时除了编码外,有时我们需要查看源码或者别人写的代码 ...

  5. httpclient遇到java.net.URISyntaxException: Illegal character in scheme name at index 0:

    正准备按照大佬的解决办法处理, 看会一条回复,说url有空格 检查了一下,还真是有空格 去除url中的空格,问题解除

  6. Linq处理list数据

    获取数据列表. //获取数据列表,Model是类 IList<Model> list = dao.getmx(Model, pageInfo);//DataTable数据DataTable ...

  7. 卷积神经网络中的通道 channel

    卷积神经网络中 channels 分为三种:    (1):最初输入的图片样本的 channels ,取决于图片类型,比如RGB, channels=3    (2):卷积操作完成后输出的 out_c ...

  8. PHP之文件的锁定、上传与下载的方法

    1.文件锁定 现在都在讲究什么分布式.并发等,实际上文件的操作也是并发的,在网络环境下,多个用户在同一时刻访问页面,对同一服务器上的同一文件进行着读取,如果,这个用户刚好读到一半,另一个用户就写入了消 ...

  9. git cherry命令来比较两个分支的不同

    git cherry 命令使用 1. 两个参数的情况 git cherry -v origin/master asa 比较本地的asa分支和远程master的差别 git cherry -v mast ...

  10. 【python之路38】Python正则表达式匹配反斜杠“\”

    一.引入 在学习了Python特殊字符和原始字符串之后,我觉得答案应该是这样的: 1)普通字符串:'\\'2)原始字符串:r'\'但事实上在提取诸如“3\8”反斜杠之前的数字时,我屡次碰壁,始终得不到 ...