C#如何消除验证码图片的锯齿效果
作者:garfieldzf 发布时间:2023-11-05 04:49:14
标签:C#,锯齿,验证码
引言
基于生成图片实现了一个手机号转图片的需求。 内容也很简单,直接用手机号生成一个png图片。就是为了背景透明以便其他地方调用。 有无锯齿主要依靠一句代码:g.TextRenderingHint= TextRenderingHint.AntiAlias;
生成图片
1、有锯齿
2、无锯齿
生成方法
string color = "#ff6633";
System.Drawing.Bitmap image = new System.Drawing.Bitmap(170, 35);
Graphics g = Graphics.FromImage(image);
try
{
g.TextRenderingHint= TextRenderingHint.AntiAlias; //消除锯齿
//生成随机生成器
Random random = new Random();
//清空图片背景色
//g.Clear(Color.Transparent);
//画图片的背景噪音线
/*for (int i = 0; i < 2; 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.Black), x1, y1, x2, y2);
}
*/
System.Drawing.ColorConverter colConvert = new System.Drawing.ColorConverter();
Color fontColor =(System.Drawing.Color)colConvert.ConvertFromString(color);
Font font = new System.Drawing.Font("Arial", 18, System.Drawing.FontStyle.Bold);
LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), fontColor, fontColor,LinearGradientMode.Horizontal);
g.DrawString(phone, font, brush, 2, 2);
//画图片的前景噪音点
//for (int i = 0; i < 50; i++)
//{
// int x = random.Next(image.Width);
// int y = random.Next(image.Height);
// image.SetPixel(x, y, Color.FromArgb(random.Next()));
//}
//画图片的边框线
//g.DrawRectangle(new Pen(Color.White), 0, 0, image.Width - 1, image.Height - 1);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
Color backColor = image.GetPixel(1, 1);
image.MakeTransparent(backColor);
image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
context.Response.ClearContent();
context.Response.ContentType = "image/x-png";
context.Response.BinaryWrite(ms.ToArray());
}
finally
{
g.Dispose();
image.Dispose();
}
参考资料
http://www.blue1000.com/bkhtml/c17/2013-03/71115.htm
来源:http://www.cnblogs.com/sword-successful/archive/2016/09/18/5880866.html


猜你喜欢
- 简介简单工厂模式 (Simple Factory) 又叫静态工厂方法(Static Factory Method)模式。简单工厂模式通常是定
- 前言Zuul 是Netflix 提供的一个开源组件,致力于在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。也有很多公司使用它来作为
- 应用特性:在很多复杂而小功能需要调用需求时,而且这些调用往往还有一定相关性,即一调用就是一系列的。结构特性:把原本复杂而繁多的调用,规划统一
- 最近在开发即时通讯这个模块的时候使用到了自定义的相机,需求与微信一样,要求相机能长按和轻点,当时在网上找自定义相机的资源,很少,所以,我在这
- 本文实例为大家分享了C# winform登陆框验证码的具体代码,供大家参考,具体内容如下1、 新建一个简单的 windows 应
- 前言在工作中有遇到这样的需求,需要把hmtl的富文本内容,进行深色模式适配。原先的富文本内容是在直接在webview上进行展示。解决思路:替
- Nacos获取不到配置的值namespace设计真实一个奇特的东西。用spring-cloud-starter-alibaba-nacos-
- 要讲到C#源码的执行过程 首先要提下程序集,因为Clr并不是和托管摸块打交道的,而是和程序集(dll,exe)1、从哪里来程序集是由一个或者
- 栈的变化规则:1、方法调用会导致栈的生长,具体包括两个步骤:一、插入方法返回地址(下图中的Fn:);二、将实际参数按值(可以使用ref或ou
- 前言EasyCache升级兼容 Springboot2,有个业务系统启动总是会卡住,最后抛出超时异常,如下:java.util.concur
- 前言AOP(Aspect Oriented Programming),即面向切面编程,是Spring框架的大杀器之一。首先,我声明下,我不是
- 1. 引入依赖pom文件引入activemq依赖<!--activeMq配置--> &
- 常规调用方式:(这个肯定会弹出cmd窗口)Runtime.getRuntime().exec("cmd.exe &nbs
- 缘起随着 App 的成长,我们难免会遇到以下这些需求:H5 跳原生界面Notification 点击调相关界面根据后台返回数据跳转界面,例如
- HttpServletRequest对象代表客户端的请求,当客户端通过HTTP
- 上一篇文章我们了解了Java背包问题求解实例代码,接下来我们看看Java中模仿用户登录的相关代码,下面是具体内容。基于用户从控制台输入模拟的
- 在 String 中提供了两个截取字符串的方法,一个是从指定位置截取到字符串结尾,另一个是截取指定范围的内容。下面对这两种方法分别进行介绍。
- 配置详情pom.xmldependency> <groupId>com.baomidou<
- spring boot 作为微服务的便捷框架,在错误页面处理上也有一些新的处理,不同于之前的spring mvc 500的页面处理是比较简单
- 本文实例为大家分享Winform版计算器的具体实现方法,供大家参考,具体内容如下前台页面设计后台代码实现using System;using