一 图像操作环境:

1.    开启GD2图像处理并检测

在php.ini开启GD库

2.    画布坐标系说明

二. 图像基本操作(步骤)

1.    创建图像

创建画布(图像资源)

创建的方法:

方法一: 创建真彩色图像

方法二: 基于现有图像创建

2.    绘制图像

如:将字符或汉字写入图像,缩略图,水印图像…..

3.    输出图像

生成的图像在哪个地方显示.

两个地方

1.通过浏览器来显示

Header(‘content-type:image/jpeg’);  //设置让浏览器显示图像

Imagejpeg(图像资源);  //将图像资源输出

2.图像以文件的形式在操作系统中显示.

Imagejpeg(图像资源,’文件名.jpg’);

如: Imagejpeg(图像资源,’1.jpg’)

4.    销毁图像

将图像资源销毁,目的释放内存.

Imagedestroy(图像资源);  //当前页面有多少图像资源就销毁多少.

方法一:创建图片资源生成验证码:

  1. <?php
  2. // 第一步:创建图像资源
  3.  
  4. // 方法一:创建真彩色图像
  5. // imagecreatetruecolor(width, height); 单位是像素
  6. $image = imagecreatetruecolor(100, 30);
  7. // 分配颜色
  8. // imagecolorallocate(图像资源, red, green, blue);RGB,取值0~255
  9. $bgcolor = imagecolorallocate($image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
  10. // imagesx($image); //获取画布的宽度
  11. // imagesy($image); //获取画布的高度
  12.  
  13. // 填充背景
  14. // imagefill(图像资源,x,y,用什么颜色填充背景); x,y是填充的坐标
  15. imagefill($image,0,0,$bgcolor);
  16. // 第二步:图像绘制
  17. /*
  18. 绘制图像(建议)的操作方法
  19. 1.首先将核心的函数(形参)写出来,然后在个形参前加$符号
  20. 2.在调用函数之前,对个形参从左到右一个一个进行设置
  21. */
  22.  
  23. // 在图片中写入字符串
  24. // font 字符串的大小 , x,y 写入时的坐标 string 写入的字符串 color 文字颜色
  25. $font = 5; //1~5
  26.  
  27. // 验证码开始
  28. $str = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890';
  29. $string = substr(str_shuffle($str),0,5); //打乱字符 截取5个字符
  30. // 验证码结束
  31.  
  32. // $string = 'helloworld'; //注意:不支持汉字
  33. /*
  34. 字符水平坐标
  35. 字符水平坐标 = (画布宽度-所有字符的宽度和)/2
  36. 字符水平坐标 = (300-所有字符的宽度和)/2
  37. 字符水平坐标 = (300-一个字符宽度 * 字符个数)/2
  38. 字符水平坐标 = (300-imagefontwidth($font) * 字符个数)/2
  39. 字符水平坐标 = (300-imagefontwidth($font) * strlen($string))/2
  40. */
  41. $x = ( imagesx($image)-imagefontwidth($font) * strlen($string))/2;
  42. /*字符的垂直方向
  43. (画布的高度 - 一个字符的高度)/2
  44. (200-一个字符的高度)/2 */
  45. $y = ( imagesy($image)-imagefontheight($font))/2;
  46. $color = imagecolorallocate($image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
  47. imagestring($image, $font, $x, $y, $string, $color);
  48. // mt_rand(min,max); 产生随机数
  49. // 加入干扰线
  50. for ($i=0; $i <15 ; $i++) {
  51. $linecolor = imagecolorallocate($image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
  52. imageline($image,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100),mt_rand(0,50),$linecolor);
  53. }
  54. // 加入干扰像素点
  55.  
  56. for ($i=0; $i <100 ; $i++) {
  57. $pixcolor = imagecolorallocate($image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
  58. imagesetpixel($image, mt_rand(0,50), mt_rand(0,50), $pixcolor);
  59. }
  60.  
  61. /*// 画圆,弧
  62. $cx = 100;
  63. $cy = 100;
  64.  
  65. $width = 150;
  66. $height = 150;
  67.  
  68. $start = 0;
  69. $end = 360;
  70. $color = imagecolorallocate($image,0,255,255);
  71. // cx,cy 圆形的坐标, width,height 长轴,短轴 start,end 弧的开始和结束的角度,默认开始的是3点钟方向,顺序是顺时针 color线的颜色
  72. imagearc($image, $cx, $cy,$width, $height, $start, $end, $color);*/
  73.  
  74. /*//画矩形
  75. // x1,y1 左上角坐标 X2,y2 右下角坐标
  76. // imagerectangle(image, x1, y1, x2, y2, color);
  77. $x1 = 20;
  78. $y1 = 20;
  79.  
  80. $x2 = 150;
  81. $y2 = 150;
  82. $color = imagecolorallocate($image,0,0,255);
  83. imagerectangle($image, $x1, $y1, $x2, $y2, $color);*/
  84.  
  85. /*// 画一条直线
  86. $x1 = 0;
  87. $y1 = 0;
  88.  
  89. $x2 = 100;
  90. $y2 = 100;
  91. $color = imagecolorallocate($image,0,255,0); //红线
  92.  
  93. // 调用函数
  94. // imageline(图像资源,x1,y1,x2,y2,线的颜色);
  95. imageline($image,$x1,$y1,$x2,$y2,$color);
  96. */
  97.  
  98. // 方法二:基于现有的图像
  99.  
  100. // 第三步:输出图像
  101. // 1.通过浏览器来显示
  102. // header('content-type:image/jpeg');
  103. header('content-type:image/png');
  104. // imagejpeg(图像资源);
  105. imagejpeg($image);
  106.  
  107. // 2.生成单独文件
  108. // imagejpeg($image,'1.jpg');
  109. // 第四步:销毁图像
  110. // imagedestroy(图像资源);
  111. imagedestroy($image);

方法二: 基于现有的图像生成的验证码:

  1. <?php
  2. // 第一步:创建图像资源
  3.  
  4. // 方法二:基于现有的图像
  5. $filename = './sucai/code.png';
  6. $image = imagecreatefrompng($filename);
  7.  
  8. // 第二步:图像绘制
  9. // 将TTF文字字符写入图像
  10. // size 字符大小 angle旋转的角度 x,y写入的坐标 color字符颜色 fontfile字体路径 text准备写入的字符
  11. $size = 20;
  12. $angle = 0;
  13. $x = 12;
  14. $y = 25;
  15. $color = imagecolorallocate($image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
  16. $fontfile = './sucai/Candarai.ttf';
  17. // 验证码开始
  18. $str = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890';
  19. $text = substr(str_shuffle($str),0,5); //打乱字符 截取5个字符
  20. // 验证码结束
  21. // $text = '中国江南皮鞋厂专属水印';
  22. imagettftext($image, $size, $angle, $x, $y, $color, $fontfile, $text);
  23.  
  24. // 第三步:输出图像
  25. // 1.通过浏览器来显示
  26. // header('content-type:image/jpeg');
  27. header('content-type:image/png');
  28. // imagejpeg(图像资源);
  29. imagejpeg($image);
  30.  
  31. // 2.生成单独文件
  32. // imagejpeg($image,'1.jpg');
  33. // 第四步:销毁图像
  34. // imagedestroy(图像资源);
  35. 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

  1. <?php
  2. session_start();
  3. // 第一步:创建图像资源
  4.  
  5. // 方法二:基于现有的图像
  6. $filename = './sucai/code.png';
  7. $image = imagecreatefrompng($filename);
  8.  
  9. // 第二步:图像绘制
  10. // 将TTF文字字符写入图像
  11. // size 字符大小 angle旋转的角度 x,y写入的坐标 color字符颜色 fontfile字体路径 text准备写入的字符
  12. $size = 20;
  13. $angle = 0;
  14. $x = 12;
  15. $y = 25;
  16. $color = imagecolorallocate($image,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
  17. $fontfile = './sucai/Candarai.ttf';
  18. // 验证码开始
  19. $str = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890';
  20. $text = substr(str_shuffle($str),0,5); //打乱字符 截取5个字符
  21.  
  22. // 将验证码写入session
  23. $_SESSION['checkcode'] = $text;
  24.  
  25. // 验证码结束
  26. // $text = '中国江南皮鞋厂专属水印';
  27. imagettftext($image, $size, $angle, $x, $y, $color, $fontfile, $text);
  28. // 第三步:输出图像
  29. // 1.通过浏览器来显示
  30. // header('content-type:image/jpeg');
  31. header('content-type:image/png');
  32. // imagejpeg(图像资源);
  33. imagejpeg($image);
  34.  
  35. // 2.生成单独文件
  36. // imagejpeg($image,'1.jpg');
  37. // 第四步:销毁图像
  38. // imagedestroy(图像资源);
  39. 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 //源图像的宽和高

  1. <?php
  2. // 第一步:创建图像资源
  3.  
  4. // 方法二:基于现有的图像
  5. $src_file = './sucai/1.jpg';
  6. $src_image = imagecreatefromjpeg($filename);
  7.  
  8. //imagesx($src_image); //获取画布宽度
  9. //imagesy($src_image); //获取画布高度
  10.  
  11. // getimagesize($src_image);
  12. // list 可以取得数组对应下标的值
  13. list($src_w,$src_h)= getimagesize($src_file);
  14. $per = 0.5;
  15. // 目标宽高
  16. $dst_w = $per * $src_w;
  17. $dst_h = $per * $src_h;
  18.  
  19. $dst_image = imagecreatetruecolor($dst_w,$dst_h);
  20. // 第二步:图像绘制
  21. //缩略图,将大图等比缩小图
  22. imagecopyresampled($dst_image, $src_image, 0, 0, 0, 0, $dst_w, $dst_h, $src_w, $src_h) ;
  23. // imagecopyresized(dst_image, src_image, dst_x, dst_y, src_x, src_y, dst_w, dst_h, src_w, src_h);
  24.  
  25. // 第三步:输出图像
  26. // 1.通过浏览器来显示
  27. // header('content-type:image/jpeg');
  28. header('content-type:image/jpeg');
  29. // imagejpeg(图像资源);
  30. imagejpeg($dst_image);
  31.  
  32. // 2.生成单独文件
  33. // imagejpeg($image,'1.jpg');
  34. // 第四步:销毁图像
  35. // imagedestroy(图像资源);
  36. imagedestroy($dst_image);
  37. 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

  1. <?php
  2. //第一步: 创建图像
  3. //方法二: 基于现有的图像
  4. $dst_file = './sucai/1.jpg'; //大图
  5. $src_file = './sucai/logo.gif'; //小图
  6.  
  7. //目标资源,大图
  8. $dst_im = imagecreatefromjpeg($dst_file);
  9. //源资源logo
  10. $src_im = imagecreatefromgif($src_file);
  11.  
  12. //获取源logo的宽与高
  13. list($src_w, $src_h ) = getimagesize($src_file);
  14. list($dst_w, $dst_h ) = getimagesize($dst_file);
  15.  
  16. // imagesx($src_image); //获取画布的宽度
  17. // imagesy($src_image); //获取画布的高度
  18. //list — 把数组中的值赋给一些变量
  19. /*echo "<pre>";
  20. print_r(getimagesize($src_file));
  21. echo "</pre>";
  22. echo "<hr>";
  23. die;*/
  24. //list($src_w,$src_h) = getimagesize($src_file);
  25. $dst_x = ($dst_w - $src_w)/2;
  26. $dst_y = ($dst_h - $src_h)/2;
  27.  
  28. $src_x = 0;
  29. $src_y = 0;
  30. $pct = 50; //0-100
  31. imagecopymerge($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct);
  32.  
  33. //第三步: 输出图像
  34. header('content-type:image/jpeg');
  35. //imagejpeg(图像资源);
  36. imagejpeg($dst_im);
  37.  
  38. //第四步: 销毁图像
  39. //imagedestroy(图像资源);
  40. imagedestroy($dst_im);
  41. imagedestroy($src_im);
  42.  
  43. ?>

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. 联想 Z470个人安装黑苹果参考

    笔记本是联想 Z470,cpu i3-2350M 傻瓜图文式]Win系统下制作U盘CLOVER引导 EDIT部分 进去黑屏 U盘引导盘

  2. 阿里云“网红"运维工程师白金:做一个平凡的圆梦人

    他是阿里云的一位 P8 运维专家,却很有野心得给自己取花名“辟拾(P10)”:他没有华丽的履历,仅凭着 26 年的热爱与坚持,一步一个脚印踏出了属于自己的技术逆袭之路:他爱好清奇,练就了能在 20 秒 ...

  3. 左神算法书籍《程序员代码面试指南》——1_10最大值减去最小值小于或等于num的子数组数量

    [题目]给定数组arr和整数num,共返回有多少个子数组满足如下情况:max(arr[i.j]) - min(arr[i.j]) <= num max(arfi.j])表示子数组ar[ij]中的 ...

  4. Java学习笔记 - 类方法与代码块的执行顺序

    类的初始化顺序 使用一个简单的父子类例子来做示范,代码执行顺序在代码后有标注. class Parent { public static String p_StaticField = "父类 ...

  5. [原创]最优化/Optimization文章合集

    转载请注明出处:https://www.codelast.com/ 最优化(Optimization)是应用数学的一个分支,它是研究在给定约束之下如何寻求某些因素(的量),以使某一(或某些)指标达到最 ...

  6. python 与 selenium 学习笔记

    在写自动运行测试用例,并且生成HTML报告的时候,遇到了这个报错: UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in positi ...

  7. Redis源码解析:11RDB持久化

    Redis的RDB持久化的相关功能主要是在src/rdb.c中实现的.RDB文件是具有一定编码格式的数据文件,因此src/rdb.c中大部分代码都是处理数据格式的问题. 一:RDB文件格式 上图就是一 ...

  8. Echarts 的简单使用

    http://echarts.baidu.com/index.html 直接用script引入从官网下载的echarts.js文件 官网的文件有几种版本的,按需下载即可,注意精简版的只显示折线.圆柱等 ...

  9. 前端插件--swipe.js

    swipe.js的作用: 这是一个轻量级的移动滑动组件,支持触摸移动,支持响应式页面. 效果图: 代码: <!DOCTYPE html> <html lang="en&qu ...

  10. 在多版本python的pip的安装与对应包的安装

    最近花了好长时间在搞这个,由于Deepin下python有两个版本,并且都没有安装pip,之前的博文默认安装pip给python2.7,结果各种问题,在此将之前走过的弯路整合起来: 首先,安装pip ...