截止.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 = 1000, height = 1000; 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(0,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(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel); g.Dispose(); return b; } catch(Exception ex) { return null; } }
示例2.生成图片验证码:
1 public class VierificationCodeServices 2 { 3 /// <summary> 4 /// 该方法用于生成指定位数的随机数 5 /// </summary> 6 /// <param name="VcodeNum">参数是随机数的位数</param> 7 /// <returns>返回一个随机数字符串</returns> 8 private string RndNum(int VcodeNum) 9 { 10 //验证码可以显示的字符集合 11 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" + 12 ",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" + 13 ",R,S,T,U,V,W,X,Y,Z"; 14 string[] VcArray = Vchar.Split(new Char[] { ',' });//拆分成数组 15 string code = "";//产生的随机数 16 int temp = -1;//记录上次随机数值,尽量避避免生产几个一样的随机数 17 18 Random rand = new Random(); 19 //采用一个简单的算法以保证生成随机数的不同 20 for (int i = 1; i < VcodeNum + 1; i++) 21 { 22 if (temp != -1) 23 { 24 rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks));//初始化随机类 25 } 26 int t = rand.Next(61);//获取随机数 27 if (temp != -1 && temp == t) 28 { 29 return RndNum(VcodeNum);//如果获取的随机数重复,则递归调用 30 } 31 temp = t;//把本次产生的随机数记录起来 32 code += VcArray[t];//随机数的位数加一 33 } 34 return code; 35 } 36 37
/// <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 * 18, 32); g = Graphics.FromImage(Img);//从Img对象生成新的Graphics对象 g.Clear(Color.White);//背景设为白色 //在随机位置画背景点 for (int i = 0; i < 100; i++) { int x = random.Next(Img.Width); int y = random.Next(Img.Height); g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1); } //验证码绘制在g中 for (int i = 0; i < code.Length; i++) { int cindex = random.Next(7);//随机颜色索引值 int findex = random.Next(5);//随机字体索引值 Font f = new Font(fonts[findex], 15, FontStyle.Bold);//字体 Brush b = new SolidBrush(c[cindex]);//颜色 int ii = 4; if ((i + 1) % 2 == 0)//控制验证码不在同一高度 { ii = 2; } g.DrawString(code.Substring(i, 1), f, b, 5 + (i * 15), ii);//绘制一个验证字符 } MemoryStream ms = new MemoryStream();//生成内存流对象 Img.Save(ms, ImageFormat.Jpeg);//将此图像以Png图像文件的格式保存到流中 ms.Seek(0, SeekOrigin.Begin);//指针回归 //回收资源 g.Dispose(); Img.Dispose(); return ms; }