开发基于Web Service的图片验证码服务

最近一直在研究SmartClient ,因工作需要,参考了网友的代码后,写了这个基于Web Service的图片验证码服务 ,和大家共同分享。


具体实现如下:
    在VS2003.NET中新建web服务,名称为SmartClientWS,添加代码如下:
   本帖相关代码
/// <summary>
        /// 生成图片验证码
        /// </summary>
        /// <param name="nLen">验证码的长度</param>
        /// <param name="strKey">输出参数,验证码的内容</param>
        /// <returns>图片字节流</returns>
        [WebMethod]
        public byte[] GenerateVerifyImage(int nLen,ref string strKey)
        {
            int nBmpWidth = 13*nLen+5;
            int nBmpHeight = 25;
            System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(nBmpWidth,nBmpHeight);

            // 1. 生成随机背景颜色
            int nRed,nGreen,nBlue;  // 背景的三元色
            System.Random rd = new Random((int)System.DateTime.Now.Ticks);
            nRed = rd.Next(255)%128+128;
            nGreen = rd.Next(255)%128+128;
            nBlue = rd.Next(255)%128+128;

            // 2. 填充位图背景
            System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(bmp);
            graph.FillRectangle(new SolidBrush(System.Drawing.Color.FromArgb(nRed,nGreen,nBlue))
                ,0
                ,0
                ,nBmpWidth
                ,nBmpHeight);


            // 3. 绘制干扰线条,采用比背景略深一些的颜色
            int nLines = 3;
            System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.FromArgb(nRed-17,nGreen-17,nBlue-17),2);
            for(int a =0;a< nLines;a++)
            {
                int x1 = rd.Next() % nBmpWidth;
                int y1 = rd.Next() % nBmpHeight;
                int x2 = rd.Next() % nBmpWidth;
                int y2 = rd.Next() % nBmpHeight;
                graph.DrawLine(pen,x1,y1,x2,y2);
            }

            // 采用的字符集,可以随即拓展,并可以控制字符出现的几率
            string strCode = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

            // 4. 循环取得字符,并绘制
            string strResult = "";
            for(int i=0;i<nLen;i++)
            {
                int x = (i*13 + rd.Next(3));
                int y = rd.Next(4) + 1;

                // 确定字体
                System.Drawing.Font font = new System.Drawing.Font("Courier New",
                    12 + rd.Next()%4,
                    System.Drawing.FontStyle.Bold);
                char c = strCode[rd.Next(strCode.Length)];  // 随机获取字符
                strResult += c.ToString();

                // 绘制字符
                graph.DrawString(c.ToString(),
                    font,
                    new SolidBrush(System.Drawing.Color.FromArgb(nRed-60+y*3,nGreen-60+y*3,nBlue-40+y*3)),
                    x,
                    y);
            }

            // 5. 输出字节流
            System.IO.MemoryStream bstream = new System.IO.MemoryStream();
            bmp.Save(bstream,System.Drawing.Imaging.ImageFormat.Jpeg);
            bmp.Dispose();
            graph.Dispose();

            strKey = strResult;
            byte[] byteReturn = bstream.ToArray();
            bstream.Close();

            return byteReturn;
        }
 调用Web服务:
   本帖相关代码
    private void ShowImage()
        {
            GenerateImage.SmartClientService genrate=new officeSystem.ImageGenerate.GenerateImage.SmartClientService();

            string strKey="";
            s=genrate.GenerateVerifyImage(5,ref strKey);

            if (s.Length > 0)
            {
                MemoryStream stream = new MemoryStream(s, true);

                stream.Write(s, 0, s.Length);

                DrawToScale(new Bitmap(stream));

                stream.Close();
            }

            this.textBox3.Text=strKey.ToString();

        }



以上代码,归属www.smartclient.com.cm
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值