截止.Net Core 2.0 目前官方类库的API中不支持Bitmap

System.Drawing.Primitives 这是官方的一个Drawing库,但是没有Bitmap、Graphics等很多东西,所以这个做图形验证码基本Pass了。

 zkweb.system.drawing 这个是第三方的,从mono的System.Drawing修改得来的。过程比较详细,也实现了。所以把这个的使用跟大家分享一下。

截止.Net Core 3.0 自带框架中不支持Drawing库

可以推荐使用System.Drawing.Common 微软提供的GDI+ 类库

安装命令:

Install-Package ZKWeb.System.Drawing

常用的操作,基本上和GDI+相同

实例1,修改图片为JPEG 格式,能缩小图片的大小而且相对比较清晰

static void ImgTestTwo()
{
string filename = @"E:\CoreWork\backone.jpg";
string targetname = @"E:\CoreWork\temp1.jpg"; Bitmap bitmap = new Bitmap(filename);
//保持图片的比例不变,缩放图片
int width = ,
height = ;
if (bitmap.Width > bitmap.Height)
{
//宽度为大,计算高度
height = Convert.ToInt32(width * (bitmap.Height * 1.0 / bitmap.Width));
}
else
{
//高度为大,计算宽度
width = Convert.ToInt32(height * (bitmap.Width * 1.0 / bitmap.Height));
}
Bitmap result = ResizeImage(bitmap, width, height); filename = filename.Substring(,filename.LastIndexOf('.'))+".jpg";
//保存图片,指定保存 格式为Jpeg,占用空间会比较小
result.Save(targetname,ImageFormat.Jpeg);
result.Dispose();
bitmap.Dispose();
}
/// <summary>
/// Resize图片
/// </summary>
/// <param name="bmp">原始Bitmap </param>
/// <param name="newW">新的宽度</param>
/// <param name="newH">新的高度</param>
/// <returns>处理以后的图片</returns>
public static Bitmap ResizeImage(Bitmap bmp, int newW, int newH)
{
try
{
Bitmap b = new Bitmap(newW, newH);
Graphics g = Graphics.FromImage(b);
// 插值算法的质量
//g.InterpolationMode = InterpolationMode.NearestNeighbor;
g.DrawImage(bmp, new Rectangle(, , newW, newH), new Rectangle(, , bmp.Width, bmp.Height), GraphicsUnit.Pixel);
g.Dispose();
return b;
}
catch(Exception ex)
{
return null;
}
}

示例2.生成图片验证码:

   public class VierificationCodeServices
{
/// <summary>
/// 该方法用于生成指定位数的随机数
/// </summary>
/// <param name="VcodeNum">参数是随机数的位数</param>
/// <returns>返回一个随机数字符串</returns>
private string RndNum(int VcodeNum)
{
//验证码可以显示的字符集合
string Vchar = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,p" +
",q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,P,P,Q" +
",R,S,T,U,V,W,X,Y,Z";
string[] VcArray = Vchar.Split(new Char[] { ',' });//拆分成数组
string code = "";//产生的随机数
int temp = -;//记录上次随机数值,尽量避避免生产几个一样的随机数 Random rand = new Random();
//采用一个简单的算法以保证生成随机数的不同
for (int i = ; i < VcodeNum + ; i++)
{
if (temp != -)
{
rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks));//初始化随机类
}
int t = rand.Next();//获取随机数
if (temp != - && temp == t)
{
return RndNum(VcodeNum);//如果获取的随机数重复,则递归调用
}
temp = t;//把本次产生的随机数记录起来
code += VcArray[t];//随机数的位数加一
}
return code;
}
        /// <summary>
/// 生成图片验证码
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public static MemoryStream ValideCode(string code)
{
Bitmap Img = null;
Graphics g = null;
Random random = new Random();
//验证码颜色集合
Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
//验证码字体集合
string[] fonts = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" }; //定义图像的大小,生成图像的实例
Img = new Bitmap((int)code.Length * , );
g = Graphics.FromImage(Img);//从Img对象生成新的Graphics对象
g.Clear(Color.White);//背景设为白色 //在随机位置画背景点
for (int i = ; i < ; i++)
{
int x = random.Next(Img.Width);
int y = random.Next(Img.Height);
g.DrawRectangle(new Pen(Color.LightGray, ), x, y, , );
}
//验证码绘制在g中
for (int i = ; i < code.Length; i++)
{
int cindex = random.Next();//随机颜色索引值
int findex = random.Next();//随机字体索引值
Font f = new Font(fonts[findex], , FontStyle.Bold);//字体
Brush b = new SolidBrush(c[cindex]);//颜色
int ii = ;
if ((i + ) % == )//控制验证码不在同一高度
{
ii = ;
}
g.DrawString(code.Substring(i, ), f, b, + (i * ), ii);//绘制一个验证字符
}
MemoryStream ms = new MemoryStream();//生成内存流对象
Img.Save(ms, ImageFormat.Jpeg);//将此图像以Png图像文件的格式保存到流中
ms.Seek(, SeekOrigin.Begin);//指针回归 //回收资源
g.Dispose();
Img.Dispose();
return ms;
}

找背景图参考:http://beijing.gongjuji.net/

更多:

Asp.Net Core 文件上传处理

Asp.Net Core获取当前上线文对象

Asp.Net Core 视图整理(一)

最新文章

  1. MySql分页算法
  2. Javascript运动基础
  3. 使用ajax预加载图片
  4. hdu 5269 ZYB loves Xor I
  5. Centos5下安装监控工具nmon
  6. 了解 XSS 攻击原理
  7. python第十二天-----RabbitMQ
  8. Hash与Map
  9. Python之str(),repr(),``
  10. ARM指令协处理器处理指令
  11. 将Ecshop后台fckeditor升级更改为kindeditor 4.1.10编辑器
  12. 图的两种遍历:DFS&amp;BFS
  13. Nagios安装、配置、问题记录
  14. 第三十八天 GIL 进程池与线程池
  15. 使用vscode 编写Markdown文件
  16. Wireshark常用过滤使用方法
  17. windows 日志解决方法
  18. greenlet
  19. Linux驱动之建立一个hello模块
  20. 安装中文输入法 ubuntu shortcut desktop

热门文章

  1. react 15
  2. httpclient初步封装
  3. 一个页面从输入URL 到页面加载显示完成,这个过程中都发生了什么?
  4. FTP传输一定要注意使用二进制模式
  5. c# dapper mysql like 参数化
  6. 研究table-cell和overflow
  7. Understanding the STM32F0&#39;s GPIO
  8. There are no packages available for install
  9. C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\文件不断增长,如何处理?
  10. LINUX 源码+内核所有参数说明