.Net Core Bitmap位图处理

截止.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;
        }

 

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

更多:

Asp.Net Core 文件上传处理

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

Asp.Net Core 视图整理(一)

posted @ 2017-08-18 19:54  天马3798  阅读(9212)  评论(0编辑  收藏  举报