.NET学习,生成图片验证码(二)

上一篇,我已经实现了简单的图片验证码。但是该图片验证码看上去比较简单没有什么特效,不像其他网站上的验证码具有扭曲,和图片背景有噪音点的功能,这次我就准备实现这个功能。

    一、图片背景噪音点的实现
    实现思路:就是在内存图片上通过setPixel方法,设置指定像素点的颜色。
    //字符串数组,存放颜色
    private static string[] BrushName = new string[]{"OliveDrab","ForestGreen", "DarkCyan", "LightSlateGray", "RoyalBlue",  
"SlateBlue", "DarkViolet","MediumVioletRed","IndianRed","Firebrick",
"Chocolate", "Peru","Goldenrod",  "Teal",  "DarkGreen",
"MediumBlue",  "Black" };
        /// <summary>
        /// 绘制图片噪音点
        /// </summary>
        /// <param name="image">图片对象</param>
        public void stainImage(Bitmap image)
        {
            Random rnd = new Random();
            //随机选择颜色
            int index = rnd.Next(BrushName.Length);
            //在图形上画20个点数字可以进行修改
            for (int n = 0; n < 20; n++)
            {
                int x = rnd.Next(image.Width-2);
                int y = rnd.Next(image.Height-2);
                image.SetPixel(x, y, Color.FromName(BrushName[index]));
            }
        }
      
        二、扭曲图片实现
        实现思路:按列循环整张图片,获取每个像素点的颜色,并通过正弦曲线获取另一个像素点的位置,用原始像素点的颜色替换正弦像素点的颜色,就可以得到一张扭曲的图片。余弦以此类推。
        /// <summary>
        /// 正弦曲线Wave扭曲图片
        /// </summary>
        /// <param name="srcBmp"></param>
        /// <param name="bXDir">true左右波动,false上下波动</param>
        /// <param name="nMultValue">波形的幅度倍数</param>
        /// <returns></returns>
        public System.Drawing.Bitmap twistImage(Bitmap srcBmp, bool bXDir, double dMultValue)
        {
            Random rnd = new Random();
            double dPhase = rnd.Next(0, 6);
            System.Drawing.Bitmap destBmp = new Bitmap(srcBmp.Width, srcBmp.Height);
            // 将位图背景填充为白色
            System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(destBmp);
            graph.FillRectangle(new SolidBrush(System.Drawing.Color.White), 0, 0, destBmp.Width, destBmp.Height);
            graph.Dispose();
            double dBaseAxisLen = bXDir ? (double)destBmp.Height : (double)destBmp.Width;
            for (int i = 0; i < destBmp.Width; i++)
            {
                for (int j = 0; j < destBmp.Height; j++)
                {
                    double dx = 0;
                    dx = bXDir ? (Math.PI * 2 * (double)j) / dBaseAxisLen : (Math.PI * 2 * (double)i) / dBaseAxisLen;
                    dx += dPhase;
                    double dy = Math.Sin(dx);
                    // 取得当前点的颜色
                    int nOldX = 0, nOldY = 0;
                    nOldX = bXDir ? i + (int)(dy * dMultValue) : i;
                    nOldY = bXDir ? j : j + (int)(dy * dMultValue);
                    System.Drawing.Color color = srcBmp.GetPixel(i, j);
                    if (nOldX >= 0 && nOldX < destBmp.Width
                     && nOldY >= 0 && nOldY < destBmp.Height)
                    {
                        destBmp.SetPixel(nOldX, nOldY, color);
                    }
                }
            }
            return destBmp;
        }
 
总结:在图片处理时,我们大量使用了setpixel和getpixel方法,这仅仅适用于处理小图片,因为这2个方法处理十分缓慢,如果是大图片的话,推荐使用unsafe代码使用指针来进行操作。
LockBits();在内存中锁定
Scan0//获取首地址指针
UnlockBits();在内存中解锁
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值