菜鸟笔记—随机字符串的验证码图片(下) 根据字符串创建验证码图片

依前文所述,这一部分是根据以获取到的字符串作为参数来创建验证码图片的静态方法CreateImage,因为这个静态方法是要创建图片,所以它的数据类型是必须是二进制数组(也就是byte[])。

在这个方法中第一件事就是要准备画布(不知道该怎么说,只能用画布这个词来代替了,毕竟这个方法跟画画很像,没有纸你就画不了),想要生成画布就得引用System.Drawing(这个不知道是程序集,还是啥的,反正是Visual Studio 2015自带的,是可以直接引用的)实例化Bitmap类,用指定的大小初始化程序集Drawing的Bitmap 类的新实例(就是制定这张图片的大小),再利用Graphics类封装一个 GDI+ 绘图图面,此类不能被继承(来自Visual Studio 2015的摘要,意思应该是将这个画布给封装起来,嗯……应该吧。),利用Clear方法规定背景颜色。

画布准备好后,就是准备绘制文字了,实例化SolidBrush类并利用属性Color确定画笔颜色,使用DrawString方法来指定字体,字号,内容以及下笔的坐标点。

接下来是绘制干扰线,因为现在的技术相当的发达,如果没有干扰线干扰的话,验证码就会被电脑轻易的识别出来,这一步得先实例化Random类作为变量,在for循环中利用这个变量的Next方法生成干扰线的起始点与收束点的坐标(x,y),再将实例化的Pen类指定的颜色与刚刚获取的这些坐标点作为DrawLine方法的参数来绘制干扰线。

接着是绘制图片的前景干扰点方法与之前绘制干扰线的方法差不多,都是for循环,同样是使用这个Random类的变量,只是区别在于一个是点,一个是线(因为我不懂前景是啥)。因为绘制的是点,所以只要一个坐标点,既然是干扰点,总不可能只有一个吧!所以在这个for循环中以实例化的Pen类指定的颜色和坐标点作为Bitmap方法的参数来绘制干扰点

还有一个边框是属于可有可无的,不过最好是写上这个边框用于区分边界,这个很简单,它将实例化的Pen类指定的颜色与坐标点以及图像的高度与宽度作为DrawRectangle方法的参数绘制边框。对了这个DrawRectangle方法是绘制由坐标对、宽度何高度指定的矩形所以这个是由两条成对的代码组成的。

最后将IO程序集引入,实例化MemoryStream类,引入程序集Drawing.Imaging,将已经实例化的MemoryStream类与封装的ImageFormat类指定的图像格式作为Save方法的参数将这个图像以指定格式保存到指定的流中,将流的内容写入byte数组返回,这样就完成的差不多了。

光说还不够,还得有物证,以下是复制过来的代码,请食用。

publicstaticbyte[] CreateImage(string strRandom) //控制器传来的参数strRandom是之前生成的随机字符串
{
    //新增图片
    Bitmap newBitmap= newBitmap(strRandom.Length *20, 38);//以字符串的字数乘以20像素为图片的长度,38为图像的高度。
    Graphics g = Graphics.FromImage(newBitmap); //
    g.Clear(Color.White); //指定背景色为白色
    //在图片上绘制文字
    SolidBrushsolidBrush = newSolidBrush(Color.Red); //文字颜色为红色
    g.DrawString(strRandom, newFont("Aril", 18), solidBrush, 12, 4); //12与4是坐标点
    //在图片上绘制干扰线
    Random random= newRandom();
    for (int i = 0; i < 10;i++)//随机绘制十条干扰线
    {
        //产生一条线,并绘制到画布。 起始点(x,y)  总结点
        int x1 =random.Next(newBitmap.Width);
        int y1 =random.Next(newBitmap.Height);
        int x2 = random.Next(newBitmap.Width);
        int y2 =random.Next(newBitmap.Height);
        g.DrawLine(newPen(Color.DarkGray), x1, y1,x2, y2); //指定颜色为浅灰色
    }
    //绘制图片的前景干扰点
    for (int i = 0; i < 100;i++)//随机绘制一百干扰点
    {
        int x =random.Next(newBitmap.Width);
        int y =random.Next(newBitmap.Height);
        newBitmap.SetPixel(x, y, Color.FromArgb(random.Next()));
    }
    //在最外边绘制边框
    g.DrawRectangle(newPen(Color.Gray), 0, 0, newBitmap.Width, newBitmap.Height);
    g.DrawRectangle(newPen(Color.Gray), -1, -1, newBitmap.Width, newBitmap.Height);
    //将图转保存到内存流中
    MemoryStream ms = newMemoryStream();
    newBitmap.Save(ms, ImageFormat.Jpeg);
    returnms.ToArray();//将流内容写入byte数组返回

发布了26 篇原创文章 · 获赞 4 · 访问量 3607

猜你喜欢

转载自blog.csdn.net/weixin_44545673/article/details/90290006