網站首頁 編程語言 正文
場景
現在很多的平臺已經不使用普通的數字、字母等驗證碼了,取而代之的是拼圖類、選圖類、旋轉類或者計算類的驗證碼。關于字母數字或者中文驗證碼,在之前的文章中也有寫過;關于直接計算公式字符串的方式也寫過,所以我們就可以把這兩個拿來融合一下,做一個公式計算的驗證碼。為了方便使用,這里就把之前的生成圖片的代碼重新發一下(其實基本一樣,就是湊個字數。。。多少還是改了一點點點,因為這里公式的話涉及到了符號,所以之前有在文字中間使用橫線的就不能用了,否則會非常降低識別度,同時也改了字體、大小、位置隨機等),然后再加一個生成公式的代碼就可以咯。
需求
實現一個公式計算的驗證碼。
開發環境
.NET Framework版本:4.5
開發工具
Visual Studio 2013
實現代碼
/// <summary>
/// 生成驗證碼圖片
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public byte[] GenerateImg(string code)
{
Bitmap image = new Bitmap(code.Length * 25, 25);
Graphics g = Graphics.FromImage(image);
try
{
//清空圖片背景色
g.Clear(Color.White);
//增加背景干擾線
Random random = new Random();
for (int i = 0; i < 30; i++)
{
int x1 = random.Next(image.Width);
int x2 = random.Next(image.Width);
int y1 = random.Next(image.Height);
int y2 = random.Next(image.Height);
//顏色可自定義
g.DrawLine(new Pen(Color.FromArgb(186, 212, 231)), x1, y1, x2, y2);
}
//定義驗證碼字體
Font font = new Font("黑體", 12, (FontStyle.Bold | FontStyle.Italic));
//定義驗證碼的刷子,這里采用漸變的方式,顏色可自定義
LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.FromArgb(67, 93, 230), Color.FromArgb(70, 128, 228), 1.5f, true);
//增加干擾點
for (int i = 0; i < 100; i++)
{
int x = random.Next(image.Width);
int y = random.Next(image.Height);
//顏色可自定義
image.SetPixel(x, y, Color.FromArgb(random.Next()));
}
//將驗證碼寫入圖片
g.DrawString(code, font, brush, random.Next(5, 50), random.Next(5, 10));
//圖片邊框
g.DrawRectangle(new Pen(Color.FromArgb(93, 142, 228)), 0, 0, image.Width - 1, image.Height - 1);
//保存圖片數據
MemoryStream stream = new MemoryStream();
image.Save(stream, ImageFormat.Jpeg);
return stream.ToArray();
}
finally
{
g.Dispose();
image.Dispose();
}
}
private void button1_Click(object sender, EventArgs e)
{
GenerateCode();
}
private void GenerateCode()
{
string[] symbols = new string[]{
"+","-","*"
};
Random random = new Random();
string code = random.Next(0, 99) + symbols[random.Next(0,symbols.Length)] + random.Next(0, 99);
//這里拿到結果用來驗證
DataTable dt = new DataTable();
string result = Convert.ToString(dt.Compute(code, null));
label1.Text = result;
byte[] bytes = GenerateImg(code);
MemoryStream ms = new MemoryStream(bytes);
Image image = System.Drawing.Image.FromStream(ms);
pictureBox1.Image = image;
}
實現效果
代碼解析:利用隨機數分別取0到99的數字,然后做加減乘(為啥沒除法?懶!因為還得算整除。),背景干擾什么的之前寫過,此處不贅述。如果說你想考驗下用戶什么的,可以自己整個難度高一點的公式,比如:1+2*3之類的,反正直接讓datatable去計算結果就行。。
原文鏈接:https://mp.weixin.qq.com/s/xY0kQjKCDE02LxHj2MmJ6Q
相關推薦
- 2022-09-21 Android開發之AAR文件的生成與使用步驟_Android
- 2022-09-12 cmd設置路由route的方法步驟_DOS/BAT
- 2022-06-01 Go中的gRPC入門教程詳解_Golang
- 2022-08-17 WPF實現Interaction框架的Behavior擴展_C#教程
- 2022-08-03 python如何實現排序,并標上序號_python
- 2022-12-29 React修改數組對象的注意事項及說明_React
- 2023-02-02 Nginx中default_server指令問題詳解_nginx
- 2022-06-01 Python?如何將?matplotlib?圖表集成進到PDF?中_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支