PHP图形图像处理之初识GD库

by admin on 2020年1月3日

应用PHP5中GD库生成图形验证码

将二维码与制品的id归总成一张图。。。
自己的步调是先把生成一张图,把成品的id放进去。。。然后再把二维码的图形与变化的图样归总。。。
说归并其实就是把二维码贴到生成的图上面。。。
实际代码如下

d=====( ̄▽ ̄*)b

  介绍生成两连串型的图形验证码: 1.何奇之有的随便字符串;  2.随机械运输算表明式

图片 1 

 代码如下

 

 图片验证码类:

看似于下面那样
1.选取GD库函数生成图片,并在图片上写钦定字符
imagecreatetruecolor 新建二个真彩图
imagecolorallocate 为生龙活虎幅图像分配颜色(调色板State of Qatar
imagestring 绘制字符
imageline 绘制线条
imagesetpixel 打像素点
2.出口图片
imagejpeg($img);
PHP完成进度,代码中注释详细,这里不做过多解释
verify.php
复制代码 代码如下:
//1.qi启用gd库GD库提供了大器晚成层层用来拍卖图片的API,使用GD库能够管理图片,或然生成图片。
//
在网址上GD库平常用来扭转缩略图大概用来对图片加水印或许对网址数量变动报表。
session_start();
//
把GBK编码的字符串调换来UTF-8字符串,第三个参数之所以写GBK,是因为本php文件在主机中存款和储蓄的编码是GBK编码
// UTF-8编码浏览器普及援助,通用性强,这里就调换到UTF-8
$str = iconv(“GBK”, “utf-8”,
“芸芸众生绿水炮台山名胜古迹敞兴奋胸便会云兴霞蔚欢娱将永生永世伴随着你”卡塔尔国;
if(!is_string($str) || !mb_check_encoding($str,”utf-8″))
{
exit(“不是字符串可能不是utf-8″State of Qatar;
}
$zhongwenku_size;
// 按UTF-8编码方式拿到字符串的长短
$zhongwenku_size = mb_strlen($str,”UTF-8″);
// 把上述字符导入数组中
$zhongwenku = array();
for( $i=0; $i{
$zhongwenku[$i] = mb_substr($str, $i,1,”UTF-8″);
}
$result = “”;
// 图片上要写入的多个字符
for($i=0; $i<4; $i++)
{
switch (rand(0, 1))
{
case 0:
$result.=$zhongwenku[rand(0, $zhongwenku_size-1)];
break;
case 1:
$result.=dechex(rand(0,15));
break;
}

$width=310; //布画宽度

引语

/// <summary>
    /// 图形验证码类
    /// </summary>
    public class PicCaptcha
    {
        #region Constructed Methods
        /// <summary>
        /// 默认构造方法
        /// </summary>
        public PicCaptcha()
        {
        }

        /// <summary>
        ///构造方法 
        /// </summary>
        /// <param name="cpatchaType">验证码类型</param>
        public PicCaptcha(CaptchaType cpatchaType)
        {
            this.CaptchaType = cpatchaType;
        }

        /// <summary>
        /// 构造方法
        /// </summary>
        /// <param name="captchaType">验证码类型</param>
        /// <param name="width">图形宽度</param>
        /// <param name="height">图形高度</param>
        public PicCaptcha(CaptchaType captchaType, int width, int height)
            : this(captchaType)
        {
            this.Width = width;
            this.Height = height;
        }

        /// <summary>
        /// 构造方法
        /// </summary>
        /// <param name="captchaType">验证码类型</param>
        /// <param name="width">图形宽度</param>
        /// <param name="height">图形高度</param>
        /// <param name="fontSize">字体大小</param>
        public PicCaptcha(CaptchaType captchaType, int width, int height, int fontSize)
            : this(captchaType, width, height)
        {
            this.FontSize = fontSize;
        }

        #endregion

        #region Fields

        private int _width = 80;                                    //default width
        private int _height = 25;                                   //default height
        private int _fontSize = 16;                                 //default fontSize
        private CaptchaType _captchaType = CaptchaType.RandomType;  //default captchaType

        #endregion

        #region Properties
        /// <summary>
        /// 验证码图形宽度
        /// </summary>
        public int Width
        {
            get { return _width; }
            set { _width = value; }
        }
        /// <summary>
        /// 验证码图形高度
        /// </summary>
        public int Height
        {
            get { return _height; }
            set { _height = value; }
        }
        /// <summary>
        /// 验证码字体大小
        /// </summary>
        public int FontSize
        {
            get { return _fontSize; }
            set { _fontSize = value; }
        }
        /// <summary>
        /// 验证码类型
        /// </summary>
        public CaptchaType CaptchaType
        {
            get { return _captchaType; }
            set { _captchaType = value; }
        }

        #endregion

        #region Public Methods

        /// <summary>
        /// 获取生成的验证码图片
        /// </summary>
        /// <param name="matchCode">与验证码图片相匹配的内容,一般将该内容保存至session中,用于校验</param>
        /// <returns>验证码图片</returns>
        public Bitmap GetCaptchaPic(out string matchCode)
        {
            matchCode = null;
            string captchaContent = null;
            switch (_captchaType)  //需要生成的验证码类型
            {
                case CaptchaType.RandomString:
                    {
                        string randomStr = CreateCheckCodeString(4);
                        captchaContent = randomStr;
                        matchCode = randomStr;
                        break;
                    }
                case CaptchaType.RandomOperationExpression:
                    {
                        string[] codes = CreateOperateCheckCode();
                        captchaContent = codes[0];
                        matchCode = codes[1];
                        break;
                    }
                case CaptchaType.RandomType:
                    {
                        RandomSelectCreateMethod(out captchaContent, out matchCode);
                        break;
                    }
                default:
                    throw new Exception("unknow CaptchaType!");
            }
            return GenerateCaptchaPic(captchaContent);   //生成验证码图片
        }

        #endregion

        #region  Private Methods

        /// <summary>
        /// 生成验证码图片
        /// </summary>
        /// <param name="captchaContent">验证码内容</param>
        /// <returns>图片</returns>
        private Bitmap GenerateCaptchaPic(string captchaContent)
        {
            var font = new Font("Arial", _fontSize, FontStyle.Bold);//验证码字体
            var brush = new SolidBrush(Color.Black);//用于写验证码的画笔
            var crosswise = new Pen(Color.Green, 0);//画横向干扰线的钢笔
            var vertical = new Pen(Color.FromArgb(255, 100, 100, 100), 0);//画纵向干扰线的钢笔
            var image = new Bitmap(_width, _height);//生成图像
            using (Graphics g = Graphics.FromImage(image))  //生成一个绘画面板(画布)
            {
                g.Clear(ColorTranslator.FromHtml("#f0f0f0"));//用指定颜色填充画布
                RectangleF rect = new RectangleF(5, 2, _width, _height);//定义文字的绘制矩形
                Random rand = new Random((int)DateTime.Now.Ticks);//生成干扰线的随机对象
                for (int i = 1; i <= 4; i++)   //干扰线
                {
                    Point start = new Point(0, rand.Next(_height));
                    Point end = new Point(_width, rand.Next(_height));
                    g.DrawLine(crosswise, start, end);
                }
                for (int i = 1; i <= 5; i++)  //干扰线
                {
                    Point start = new Point(rand.Next(_width), 0);
                    Point end = new Point(rand.Next(_width), _height);
                    g.DrawLine(vertical, start, end);
                }
                g.DrawString(captchaContent, font, brush, rect);//将验证码写到画布上
            }
            return image;
        }

        /// <summary>
        /// 随机选择生成验证码的方法
        /// </summary>
        /// <param name="captchaContent">验证码图片显示的内容</param>
        /// <param name="matchCode">与验证码图片匹配的内容</param>
        private void RandomSelectCreateMethod(out string captchaContent, out string matchCode)
        {
            captchaContent = "";
            matchCode = "";
            int currSeconds = DateTime.Now.Second;
            if (currSeconds % 2 == 0)
            {
                captchaContent = matchCode = CreateCheckCodeString(4);
            }
            else
            {
                string[] codes = CreateOperateCheckCode();
                captchaContent = codes[0];
                matchCode = codes[1];
            }
            return;
        }

        /// <summary>
        /// 生成len位随机字符串
        /// </summary>
        /// <param name="len">随机字符串长度</param>
        /// <returns>len位随机字符串</returns>
        private string CreateCheckCodeString(int len)
        {
            //定义用于验证码的字符数组
            char[] checkCodeArray ={ '1','2','3','4','5','6','7','8','9','A','B','C',
        'D','E','F','G','H','I','J','K','L','M','N','P','Q','R','S','T','U','V','W',
        'X','Y','Z'};
            //定义验证码字符串
            string randomcode = "";
            Random rd = new Random();
            //生成4位验证码字符串
            for (int i = 1; i <= len; i++)
                randomcode += checkCodeArray[rd.Next(checkCodeArray.Length)];
            return randomcode;
        }

        /// <summary>
        /// 生成随机的运算表达式  1+1=?,2
        /// </summary>
        /// <returns>codes[0]: 表达式; codes[1]: 运算结果</returns>
        private string[] CreateOperateCheckCode()
        {
            string[] codes = new string[2] { "", "" };
            string[] operators = new string[] { "+", "-" };
            int result = 0;
            Random random = new Random();
            int num1 = random.Next(10); // [0,19)
            int num2 = random.Next(10);
            string oper = operators[random.Next(operators.Length)];
            switch (oper)
            {
                case "+":
                    {
                        result = num1 + num2;
                        break;
                    }
                case "-":
                    {
                        result = num1 - num2;
                        break;
                    }
                default:
                    throw new Exception("operators error");
            }
            codes[0] = string.Format("{0}{1}{2}=?", num1, oper, num2);
            codes[1] = result.ToString();
            return codes;
        }

        #endregion
    }

    /// <summary>
    /// 生成的验证码类型
    /// </summary>
    public enum CaptchaType
    {
        /// <summary>
        /// 随机类型, 在所有支持的验证码类型中,随机选择一种
        /// </summary>
        RandomType,
        /// <summary>
        /// 普通的随机字符串,如: jH9Y, 12H8
        /// </summary>
        RandomString,
        /// <summary>
        /// 随机运算表达式, 如: 1+2=?, 5加2=?, 4-2=?
        /// </summary>
        RandomOperationExpression,
    }

}
$_SESSION[“check”] = $result;

$height=360; //布画中度
$im = imagecreate($width,$height);
$img2=imagecreatefrompng(“$url”State of Qatar;//获得二维码
$im_WH=getimagesize(“$url”卡塔尔;//得到二维码图片的属性
$im_W=$im_WH[0];
$im_H=$im_WH[1];
$white = ImageColorAllocate($im, 255,255,255卡塔尔;//定义浅紫  背景象
$black = ImageColorAllocate($im, 0,0,0卡塔尔(قطر‎;//定义水晶绿  字体颜色
$rectangelcolor=ImageColorAllocate($im,150,150,150卡塔尔;//定义边框颜色
imagerectangle($im,1,1,$width-1,$height-1,$rectangelcolor);//画边框
imagettftext($im,22,0,15,330,$black,’C:WINDOWSFontsarial.ttf’,”$proid”State of Qatar;//写入付加物id
imagecopy($im,$img2,5,5,0,0,$im_W,$im_H卡塔尔(قطر‎;//归并两张图
$images = mrand4B(卡塔尔.time(卡塔尔国. ‘.jpg’;//图片新命名
$path =
$_SERVER[‘DOCUMENT_ROOT’].’/static/downloadpic/’.$images;//图片路线
imagejpeg($im,$path卡塔尔国;//生成新图放到内定的门路中
imagedestroy($im卡塔尔国;//释放内部存款和储蓄器
return
$images;//再次来到图片名,以便存入数据库

 

  

// 创造三个真彩色图像片 宽100,高30
$img = imagecreatetruecolor(100, 30);
// 分配背景颜色
$bg = imagecolorallocate($img, 0, 0, 0);
// 分配文字颜色
$te = imagecolorallocate($img, 255,255,255);
// 在图纸上写字符串
//imagestring($img, rand(3,8), rand(1,70), rand(1,10), $result, $te);
// 在图纸上根据载入字体能够写出特别字体
imagettftext($img, 13, rand(2, 9), 20 ,20, $te, “MSYH.TTF”,$result);
$_SESSION[“check”] = $result;
for($i=0; $i<3; $i++)
{
// $t = imagecolorallocate($img, rand(0, 255),rand(0, 255),rand(0,
255));
// 画线
imageline($img, 0, rand(0, 20), rand(70,100), rand(0, 20), $te);
}
$t = imagecolorallocate($img, rand(0, 255),rand(0, 255),rand(0, 255));
// 为图片加多噪点
for($i=0; $i<200; $i++)
{
imagesetpixel($img, rand(1, 100), rand(1, 30), $t);
}
// 发送http头信息 钦命此次发送的是image中的jpeg
header(“Content-type: image/jpeg”);
// 输出jpeg图片至浏览器
imagejpeg($img);
?>

只顾phpgd库暗许是未展开了,我们借使未能使用gd库就供给张开,具体方法

php不独有局限于html的输出,还足以创立和操作有滋有味的图像文件,如GIF、PNG、JPEG、WBMP、XBM等。

诚如管理程序(.ashxState of Qatar示例:

submit.php
复制代码 代码如下:
session_start();
if(@$_POST[‘check’])
{
if($_POST[“check”] == $_SESSION[“check”])
{
echo” 恭喜你!验证码输入精确!”;
}else{
echo” 倒霉意思验证码输入错误”;
}
}
?>

我们必要在php.ini中把extension=php_gd2.dll 去掉前边的;就能够了就能够了。

php还足以将图像流直接突显在浏览器中。

/// <summary>
    /// 生成图形验证码
    /// </summary>
    public class CreateCode : IHttpHandler, IRequiresSessionState
    {
        private static readonly string CodeSessionName = "Code_Session_Name";

        public void ProcessRequest(HttpContext context)
        {
            string checkCodeSession = string.Empty; 
            var captChaPic = new PicCaptcha();
            using (var image = captChaPic.GetCaptchaPic(out checkCodeSession))  //获取验证码图片
            using (var ms = new MemoryStream())
            {
                context.Session.Add(CodeSessionName, checkCodeSession);         //验证码校验内容保存到sessioin中
                image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
                context.Response.ClearContent();
                context.Response.ContentType = "image/Gif";
                context.Response.BinaryWrite(ms.ToArray());
            }
            return;
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

图片 2

要拍卖图像,将要动用php的GD库。

  

代码中MCRUISERYH.ttf 是您要设置的书体。

ps:确认保障php.ini文件中得以加载GD库。能够在php.ini文件中找到“;extension=php_gd2.dll”,将接受前的支行删除,保存,再重启Apache服务器就能够。

 

 

下载:

步骤

相近管理程序源码文件下载,请点击. 

 

 

在php中开创三个图像相仿需求多少个步骤:

1.创造一个背景图像,今后的有着操作都以依赖此背景。

2.在图像上制图等操作。

3.输出最后图像。

4.销毁内存中的图像财富。

 

1.开立背景图像

 

上面包车型地铁函数能够回到一个图像标志符,代表了叁个宽为x_size像素、高为y_size像素的背景,默以为紫红。

 1 resource imagecreatetruecolor(int x_size
, int y_size) 

在图像上绘制必要七个步骤:首先需求接收颜色。通过imagecolorallocate(卡塔尔国函数创设颜色对象。

 1 int
imagecolorallocate(resource image,
int red, int green, int blue) 

接下来将颜色绘制到图像上。

 1 bool
imagefill(resource image, int x,
int y, int color) 

imagefill(卡塔尔国函数会在image图像的坐标(x,y)处用color颜色进行填空。

 

2.在图像上绘制

 

 1 bool
iamgeline(resource image, int
begin_x, int begin_y, int end_x, int end_y, int color) 

imageline(State of Qatar函数用color颜色在图像image中画出一条从(begin_x,begin_y)到(end_x,end_y)的线段。

 1 bool
imagestring(resource image, int
font, int begin_x, int begin_y, string s, int color ) 

imagestring(卡塔尔函数用color颜色将字符串s画到图像image的(begin_x,begin_y)处(这是字符串的左上角坐标)。假设font等于1,2,3,4或5,则采用内置字体,同一时候数字代表字体的粗细。

借使font字体不是置于的,则要求导入字体库后使用。

 

3.输出最后图像

 

成立图像今后就足以出口图形只怕封存到文件中了,要是急需输出到浏览器中要求选择header(卡塔尔(قطر‎函数发送三个图形的报头“期骗”浏览器,使它以为运转的php页面是四个图像。

 1 header(“Content-type:
image/png”); 

发送数据报头未来,利用imagepng(State of Qatar函数输出图形。前面的filename可选,代表生成的图像文件的保留名称。

 1 bool
image(resource image [, string filename]) 

 

4.销毁相关的内部存款和储蓄器能源

 

最终索要销毁图像占用的内部存款和储蓄器能源。

 1 bool
imagedestroy(resource
image) 

 

例子:

 1 <?php
 2 $width=300;                                              //图像宽度
 3 $height=200;                                             //图像高度
 4 $img=imagecreatetruecolor($width,$height);               //创建图像
 5 $white=imagecolorallocate($img,255,255,255);             //白色
 6 $black=imagecolorallocate($img,0,0,0);                   //黑色
 7 $red=imagecolorallocate($img,255,0,0);                   //红色
 8 $green=imagecolorallocate($img,0,255,0);                 //绿色
 9 $blue=imagecolorallocate($img,0,0,255);                  //蓝色
10 imagefill($img,0,0,$white);                              //将背景设置为白色
11 imageline($img,20,20,260,150,$red);                      //画出一条红色的线
12 imagestring($img,5,50,50,"hello,world!!",$blue);       //显示蓝色的文字
13 header("content-type: image/png");                    //输出图像的MIME类型
14 imagepng($img);                                          //输出一个PNG图像数据
15 imagedestroy($img);                                      //清空内存

  效果:

图片 3

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图