zoukankan      html  css  js  c++  java
  • 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(图像资源);  //当前页面有多少图像资源就销毁多少.

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

      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  ?>
  • 相关阅读:
    uniapp开发注意事项
    uniapp生成海报带二维码及保存
    严格模式的this
    数据类型
    短路特性
    第九周程序改错
    矩阵转置
    二分法求根
    三天打鱼两天晒网
    LeetCode7
  • 原文地址:https://www.cnblogs.com/mrszhou/p/7518927.html
Copyright © 2011-2022 走看看