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

安装命令:

  1. Install-Package ZKWeb.System.Drawing

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

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

  1. static void ImgTestTwo()
  2. {
  3. string filename = @"E:\CoreWork\backone.jpg";
  4. string targetname = @"E:\CoreWork\temp1.jpg";
  5.  
  6. Bitmap bitmap = new Bitmap(filename);
  7. //保持图片的比例不变,缩放图片
  8. int width = ,
  9. height = ;
  10. if (bitmap.Width > bitmap.Height)
  11. {
  12. //宽度为大,计算高度
  13. height = Convert.ToInt32(width * (bitmap.Height * 1.0 / bitmap.Width));
  14. }
  15. else
  16. {
  17. //高度为大,计算宽度
  18. width = Convert.ToInt32(height * (bitmap.Width * 1.0 / bitmap.Height));
  19. }
  20. Bitmap result = ResizeImage(bitmap, width, height);
  21.  
  22. filename = filename.Substring(,filename.LastIndexOf('.'))+".jpg";
  23. //保存图片,指定保存 格式为Jpeg,占用空间会比较小
  24. result.Save(targetname,ImageFormat.Jpeg);
  25. result.Dispose();
  26. bitmap.Dispose();
  27. }
  28. /// <summary>
  29. /// Resize图片
  30. /// </summary>
  31. /// <param name="bmp">原始Bitmap </param>
  32. /// <param name="newW">新的宽度</param>
  33. /// <param name="newH">新的高度</param>
  34. /// <returns>处理以后的图片</returns>
  35. public static Bitmap ResizeImage(Bitmap bmp, int newW, int newH)
  36. {
  37. try
  38. {
  39. Bitmap b = new Bitmap(newW, newH);
  40. Graphics g = Graphics.FromImage(b);
  41. // 插值算法的质量
  42. //g.InterpolationMode = InterpolationMode.NearestNeighbor;
  43. g.DrawImage(bmp, new Rectangle(, , newW, newH), new Rectangle(, , bmp.Width, bmp.Height), GraphicsUnit.Pixel);
  44. g.Dispose();
  45. return b;
  46. }
  47. catch(Exception ex)
  48. {
  49. return null;
  50. }
  51. }

示例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 = -;//记录上次随机数值,尽量避避免生产几个一样的随机数
  17.  
  18. Random rand = new Random();
  19. //采用一个简单的算法以保证生成随机数的不同
  20. for (int i = ; i < VcodeNum + ; i++)
  21. {
  22. if (temp != -)
  23. {
  24. rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks));//初始化随机类
  25. }
  26. int t = rand.Next();//获取随机数
  27. if (temp != - && temp == t)
  28. {
  29. return RndNum(VcodeNum);//如果获取的随机数重复,则递归调用
  30. }
  31. temp = t;//把本次产生的随机数记录起来
  32. code += VcArray[t];//随机数的位数加一
  33. }
  34. return code;
  35. }
  1. /// <summary>
  2. /// 生成图片验证码
  3. /// </summary>
  4. /// <param name="code"></param>
  5. /// <returns></returns>
  6. public static MemoryStream ValideCode(string code)
  7. {
  8. Bitmap Img = null;
  9. Graphics g = null;
  10. Random random = new Random();
  11. //验证码颜色集合
  12. Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
  13. //验证码字体集合
  14. string[] fonts = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
  15.  
  16. //定义图像的大小,生成图像的实例
  17. Img = new Bitmap((int)code.Length * , );
  18. g = Graphics.FromImage(Img);//从Img对象生成新的Graphics对象
  19. g.Clear(Color.White);//背景设为白色
  20.  
  21. //在随机位置画背景点
  22. for (int i = ; i < ; i++)
  23. {
  24. int x = random.Next(Img.Width);
  25. int y = random.Next(Img.Height);
  26. g.DrawRectangle(new Pen(Color.LightGray, ), x, y, , );
  27. }
  28. //验证码绘制在g中
  29. for (int i = ; i < code.Length; i++)
  30. {
  31. int cindex = random.Next();//随机颜色索引值
  32. int findex = random.Next();//随机字体索引值
  33. Font f = new Font(fonts[findex], , FontStyle.Bold);//字体
  34. Brush b = new SolidBrush(c[cindex]);//颜色
  35. int ii = ;
  36. if ((i + ) % == )//控制验证码不在同一高度
  37. {
  38. ii = ;
  39. }
  40. g.DrawString(code.Substring(i, ), f, b, + (i * ), ii);//绘制一个验证字符
  41. }
  42. MemoryStream ms = new MemoryStream();//生成内存流对象
  43. Img.Save(ms, ImageFormat.Jpeg);//将此图像以Png图像文件的格式保存到流中
  44. ms.Seek(, SeekOrigin.Begin);//指针回归
  45.  
  46. //回收资源
  47. g.Dispose();
  48. Img.Dispose();
  49. return ms;
  50. }

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

更多:

Asp.Net Core 文件上传处理

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

Asp.Net Core 视图整理(一)

.Net Core Bitmap位图处理的更多相关文章

  1. 重温delphi之:如何将Bitmap位图与base64字符串相互转换

    先引用delphi自带的单元 uses EncdDecd; 然后就可以使用下面二个函数了: by 菩提树下的杨过 http://yjmyzz.cnblogs.com/ ///将Bitmap位图转化为b ...

  2. delphi中Bitmap位图与base64字符串相互转换

    uses EncdDecd; ///将Bitmap位图转化为base64字符串 function BitmapToString(img:TBitmap):string ; var ms:TMemory ...

  3. bittorrent 学习(一) 种子文件分析与bitmap位图

    终于抽出时间来进行 BITTORRENT的学习了 BT想必大家都很熟悉了,是一种文件分发协议.每个下载者在下载的同时也在向其他下载者分享文件. 相对于FTP HTTP协议,BT并不是从某一个或者几个指 ...

  4. 【Bitmap Index】B-Tree索引与Bitmap位图索引的锁代价比较研究

    通过以下实验,来验证Bitmap位图索引较之普通的B-Tree索引锁的“高昂代价”.位图索引会带来“位图段级锁”,实际使用过程一定要充分了解不同索引带来的锁代价情况. 1.为比较区别,创建两种索引类型 ...

  5. Bitmap 位图

    转自: http://dongxicheng.org/structure/bitmap/ 1.  概述 位图(bitmap)是一种非常常用的结构,在索引,数据压缩等方面有广泛应用.本文介绍了位图的实现 ...

  6. 使用不安全代码将 Bitmap 位图转为 WPF 的 ImageSource 以获得高性能和持续小的内存占用

    在 WPF 中将一个现成的 Bitmap 位图转换成 ImageSource 用于显示一个麻烦的事儿,因为 WPF 并没有提供多少可以转过来的方法.不过产生 Bitmap 来源却非常多,比如屏幕截图. ...

  7. ( 转 ) 数据库BTree索引、Hash索引、Bitmap位图索引的优缺点

    测试于:MySQL 5.5.25 当前测试的版本是Mysql 5.5.25只有BTree和Hash两种索引类型,默认为BTree.Oracle或其他类型数据库中会有Bitmap索引(位图索引),这里作 ...

  8. BitMap位图

    BitMap位图算法https://blog.csdn.net/varyall/article/details/79662029 常见面试题 题1:在2.5亿个整数找出不重复的整数,内存不足以容纳着2 ...

  9. 【读书笔记《Android游戏编程之从零开始》】14.游戏开发基础(Bitmap 位图的渲染与操作)

    Bitmap 是图形类,Android 系统支持的图片格式有 png.jpg.bmp 等. 对位图操作在游戏中是很重要的知识点,比如游戏中需要两张除了大小之外其他完全相同的图,那么如果会对位图进行缩放 ...

随机推荐

  1. 字符串匹配的kmp算法 及 python实现

    一:背景 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题. Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的常 ...

  2. 常用的服务发现对比(Consul、zookeeper、etcd、eureka)

    这里就平时经常用到的服务发现的产品进行下特性的对比,首先看下结论:   Feature Consul Zookeeper Etcd Eureka 服务健康检查  服务状态,内存,硬盘等  (弱)长连接 ...

  3. django 2.0 中URL的include方法使用分析

    一.问题出现: 在使用Django2.0,配置全局URL时,希望指向某个APP的URL,配置如下: from django.contrib import admin from django.conf. ...

  4. springmvc中使用MockMvc测试controller

    示例代码 import com.alibaba.fastjson.JSONObject; import org.junit.Before; import org.junit.Test; import ...

  5. Java文件类

    在Java语言中,无论是目录还是文件,都抽象成java.io.File类 直接上示例吧 java,io,File的常用操作 删除.创建 因为我的e盘里面是没有这个文件的,所以不存在I哦 创建文件: 获 ...

  6. [转]C++实现平衡二叉树

    作者:Rest探路者  出处:http://www.cnblogs.com/Java-Starter/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意请保留此段声明,请在文章页面明显位置给出原文 ...

  7. [代码审计]yxcms从伪xss到getshell

    0x00 前言 这篇文章首发于圈子,这里作为记录一下. 整个利用链构造下来是比较有趣的,但实际渗透中遇到的几率比较少. 此次审的是yxcms 1.4.6版本,应该是最后一个版本了吧? 0x01 从任意 ...

  8. 有多少种JVM

    https://en.wikipedia.org/wiki/Comparison_of_Java_virtual_machines 在这个类别下,主流选择有:(按流行程度递减) HotSpot VM ...

  9. Android任务和返回栈完全解析(转)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/41087993 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工 ...

  10. 使用 IntraWeb (14) - 基本控件之 TIWHRule、TIWRectangle

    TIWHRule //一条横线, 对应 Html 中的 <hr/> TIWRectangle //矩形; 中间可以有行文本, 文本可任意对齐 TIWHRule 所在单元及继承链: IWHT ...