• PHP 图形处理


    计应134(实验班) 郑寿奎

    一、图片添加文字

             步骤:

                 (1)通过header()函数定义输出图像类型

                 (2)通过imagecreatefromipeg()函数载入照片

                 (3)通过imagecolorallocate()函数设置输出字体颜色

                 (4)定义字体

                 (5)通过iconv()函数对字体的编码格式进行转换

                 (6)通过imageTTFText()函数像照片添加文字

                 (7)通过imagejpeg()函数创建图片

                 (8)通过imagedestroy()函数释放资源

             <?php
                   header("content-type:image/jpeg"); //定义输出为图像类型
                   $im=imagecreatefromjpeg("images/photo.jpg");     //载入照片
                   $textcolor=imagecolorallocate($im,56,73,136);//设置字体颜色为蓝色,值为RGB颜色值
                   $fnt="c:/windows/fonts/simhei.ttf"; //定义字体
                   $motto=iconv("gb2312","utf-8","长白山天池"); //定义输出字体串
                   imageTTFText($im,220,0,480,340,$textcolor,$fnt,$motto); //写TTF文字到图中
                   imagejpeg($im); //建立JPEG图形
                   imagedestroy($im); //结束图形,释放内存空间
              ?>

          在imageTTFText()函数中,$im是指照片,220是字体的大小,0是文字的水平方向,480和340是文字的坐标,$textcolor是文字的颜色,$fnt是字体,$motto是照片文字

    运行结果如下图:

    二、使用图像处理技术生成验证码

           1)生成4位的验证码:yzm.php

    <?php
    session_start();
    header("content-type:image/png");        //设置创建图像的格式
    $image_width=70;                      //设置图像宽度
    $image_height=18;                     //设置图像高度
    srand(microtime()*100000);               //设置随机数的种子
    for($i=0;$i<4;$i++){                  //循环输出一个4位的随机数
       $new_number.=dechex(rand(0,15));
    }
    $_SESSION[check_checks]=$new_number;    //将获取的随机数验证码写入到SESSION变量中     
    
    $num_image=imagecreate($image_width,$image_height);  //创建一个画布
    imagecolorallocate($num_image,255,255,255);          //设置画布的颜色
    for($i=0;$i<strlen($_SESSION[check_checks]);$i++){  //循环读取SESSION变量中的验证码
       $font=mt_rand(3,5);                                //设置随机的字体
       $x=mt_rand(1,8)+$image_width*$i/4;               //设置随机字符所在位置的X坐标
       $y=mt_rand(1,$image_height/4);                   //设置随机字符所在位置的Y坐标
       $color=imagecolorallocate($num_image,mt_rand(0,100),mt_rand(0,150),mt_rand(0,200));       //设置字符的颜色
       imagestring($num_image,$font,$x,$y,$_SESSION[check_checks][$i],$color);                     //水平输出字符
    }
    imagepng($num_image);                  //生成PNG格式的图像
    imagedestroy($num_image);              //释放图像资源
    ?>

          2)登录验证:index.php

    <form name="form" method="post" action="">
    验证码:<img src="yzm.php" />
    <input type="text" name="yzm" id="yzm"/>
    <input type="submit" name="submit" value="提交"/>
    </form>
    <?php
    session_start();
    if($_POST["submit"]!=""){
    $checks=$_POST["yzm"];
    if($checks==""){
    echo "<script> alert('验证码不能为空');</script>";
    }else{
    if($checks==$_SESSION[check_checks]){
        echo "<script> alert('验证码正确');</script>";
    }else{
        echo "<script> alert('您输入的验证码不正确!');window.location.href='index.php';</script>";
    }}
    }
    ?>

    在表单中输出图像的内容,提交表单是判断是否正确

    运行结果如下图:

    三、水印图片

           即:一张图片印在另一张图片上

    <?php
    $dst_path = '1.jpg';
    $src_path = '2.jpg';
    //创建图片的实例
    $dst = imagecreatefromstring(file_get_contents($dst_path));
    $src = imagecreatefromstring(file_get_contents($src_path));
    //获取水印图片的宽高
    list($src_w, $src_h) = getimagesize($src_path);
    //将水印图片复制到目标图片上,最后个参数50是设置透明度,这里实现半透明效果
    imagecopymerge($dst, $src, 10, 10, 0, 0, $src_w, $src_h, 50);
    //如果水印图片本身带透明色,则使用imagecopy方法
    //imagecopy($dst, $src, 10, 10, 0, 0, $src_w, $src_h);
    //输出图片
    list($dst_w, $dst_h, $dst_type) = getimagesize($dst_path);
    switch ($dst_type) {
        case 1://GIF
            header('Content-Type: image/gif');
            imagegif($dst);
            break;
        case 2://JPG
            header('Content-Type: image/jpeg');
            imagejpeg($dst);
            break;
        case 3://PNG
            header('Content-Type: image/png');
            imagepng($dst);
            break;
        default:
            break;
    }
    imagedestroy($dst);
    imagedestroy($src);
    ?>

    运行结果如下图:

  • 相关阅读:
    LinkedHashMap、HashMap和TreeMap的比较使用
    RocketMQ之Namesrv
    mysql创建、删除、查看索引
    java8 JVM堆内存(heap) 新生代 老年代 元空间垃圾回收详解
    Java中GCRoots包括哪些
    单例模式双重校验锁
    内存屏障
    LockSupport的用法及原理
    HashSet,TreeSet和LinkedHashSet的区别
    Windows常用网络命令技巧汇总
  • 原文地址:https://www.cnblogs.com/ZSK991656110/p/4968320.html
Copyright © 2020-2023  润新知