截止.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+ 类库

.Net Core Bitmap位图处理_.Net Core Bitmap位图处理

安装命令:


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;         }


 ​