zoukankan      html  css  js  c++  java
  • .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:CoreWorkackone.jpg";
        string targetname = @"E:CoreWork	emp1.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 视图整理(一)

  • 相关阅读:
    Python学习笔记(四)多进程的使用
    Python学习笔记(三)多线程的使用
    windows无法安装msi文件
    标签传播算法
    信息论基础
    模块度Q
    HTTPS开发(SSL--用Tomcat服务器配置https双向认证)
    oracle 优化
    eclipse 界面开发--windowbuilder
    vba 读取数据库
  • 原文地址:https://www.cnblogs.com/tianma3798/p/7391552.html
Copyright © 2011-2022 走看看