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__" 方法中至少一个的对象.什么是非 ...
随机推荐
- CA证书制作
目录 手动制作CA证书 1.安装 CFSSL 2.初始化cfssl 3.创建用来生成 CA 文件的 JSON 配置文件 4.创建用来生成 CA 证书签名请求(CSR)的 JSON 配置文件 5.生成C ...
- linux 编译C语言代码后产生OBJ文件的方法
如果你不指定编译成什么文件,gcc默认一步到位,直接生成可执行文件你可以试试以下几个参数 -c 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件 例子用法: gcc -c hello.c 他 ...
- PAT甲级——A1025 PAT Ranking
Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Zhe ...
- day65——day69
目录 DAY65 课堂笔记 1.vue实例 2.插值表达式 3.文本指令 4.面向对象js 5.js函数补充 6.事件指令 7.属性指令 DAY66 课堂笔记 1.表单指令 2.条件指令 3.循环指令 ...
- Spring Cloud Consul综合整理
该项目通过自动配置和Spring环境以及其他Spring编程模型习惯用法提供了Spring Boot应用程序的Consul集成. 通过一些简单的注释,您可以快速启用和配置应用程序内的通用模式,并使用基 ...
- android 数据绑定(2)绑定表达式
1.官方文档 https://developer.android.com/topic/libraries/data-binding/expressions.html 2.绑定表达式的约束 2.1 允许 ...
- 图像通道、Scalar、分离、合成通道
http://lib.csdn.net/article/opencv/33264 http://blog.csdn.net/laohu_tiger/article/details/17359777 h ...
- hdu 2586 (lca-RMQ)
#include <iostream> #include <cstdlib> #include <cstring> #include <queue> # ...
- PHP获取搜索引擎关键词
有时候我们需要知道用户通过哪个搜索引擎,通过拿个关键词访问我们页面,当然js也可以实现,这里介绍下php的实现代码,包含(百度.谷歌.雅虎.搜狗.搜搜.必应.有道)几大搜索引擎的获取方法. //获取来 ...
- Spring事务传播行为详解
前言 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为.事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为.这是Spring ...