一 图像操作环境:

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. CA证书制作

    目录 手动制作CA证书 1.安装 CFSSL 2.初始化cfssl 3.创建用来生成 CA 文件的 JSON 配置文件 4.创建用来生成 CA 证书签名请求(CSR)的 JSON 配置文件 5.生成C ...

  2. linux 编译C语言代码后产生OBJ文件的方法

    如果你不指定编译成什么文件,gcc默认一步到位,直接生成可执行文件你可以试试以下几个参数 -c 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件 例子用法: gcc -c hello.c 他 ...

  3. PAT甲级——A1025 PAT Ranking

    Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Zhe ...

  4. day65——day69

    目录 DAY65 课堂笔记 1.vue实例 2.插值表达式 3.文本指令 4.面向对象js 5.js函数补充 6.事件指令 7.属性指令 DAY66 课堂笔记 1.表单指令 2.条件指令 3.循环指令 ...

  5. Spring Cloud Consul综合整理

    该项目通过自动配置和Spring环境以及其他Spring编程模型习惯用法提供了Spring Boot应用程序的Consul集成. 通过一些简单的注释,您可以快速启用和配置应用程序内的通用模式,并使用基 ...

  6. android 数据绑定(2)绑定表达式

    1.官方文档 https://developer.android.com/topic/libraries/data-binding/expressions.html 2.绑定表达式的约束 2.1 允许 ...

  7. 图像通道、Scalar、分离、合成通道

    http://lib.csdn.net/article/opencv/33264 http://blog.csdn.net/laohu_tiger/article/details/17359777 h ...

  8. hdu 2586 (lca-RMQ)

    #include <iostream> #include <cstdlib> #include <cstring> #include <queue> # ...

  9. PHP获取搜索引擎关键词

    有时候我们需要知道用户通过哪个搜索引擎,通过拿个关键词访问我们页面,当然js也可以实现,这里介绍下php的实现代码,包含(百度.谷歌.雅虎.搜狗.搜搜.必应.有道)几大搜索引擎的获取方法. //获取来 ...

  10. Spring事务传播行为详解

    前言 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为.事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为.这是Spring ...