• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

PHP核心编程-图像操作

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

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

 1 <?php
 2 // 第一步:创建图像资源
 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     // $text = '中国江南皮鞋厂专属水印';
23     imagettftext($image, $size, $angle, $x, $y, $color, $fontfile, $text);
24 
25 
26 
27 
28 
29 // 第三步:输出图像
30     // 1.通过浏览器来显示
31     // header('content-type:image/jpeg');
32     header('content-type:image/png');
33     // imagejpeg(图像资源);
34     imagejpeg($image);
35 
36 
37     // 2.生成单独文件
38     // imagejpeg($image,'1.jpg');
39 // 第四步:销毁图像
40     // imagedestroy(图像资源);
41     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 //源图像的宽和高

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

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Android与PHP服务器交互发布时间:2022-07-10
下一篇:
PHP常用方法整理发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap