.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 = ,
- height = ;
- 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(,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(, , newW, newH), new Rectangle(, , bmp.Width, bmp.Height), GraphicsUnit.Pixel);
- g.Dispose();
- return b;
- }
- catch(Exception ex)
- {
- return null;
- }
- }
示例2.生成图片验证码:
- public class VierificationCodeServices
- {
- /// <summary>
- /// 该方法用于生成指定位数的随机数
- /// </summary>
- /// <param name="VcodeNum">参数是随机数的位数</param>
- /// <returns>返回一个随机数字符串</returns>
- private string RndNum(int VcodeNum)
- {
- //验证码可以显示的字符集合
- 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" +
- ",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" +
- ",R,S,T,U,V,W,X,Y,Z";
- string[] VcArray = Vchar.Split(new Char[] { ',' });//拆分成数组
- string code = "";//产生的随机数
- int temp = -;//记录上次随机数值,尽量避避免生产几个一样的随机数
- Random rand = new Random();
- //采用一个简单的算法以保证生成随机数的不同
- for (int i = ; i < VcodeNum + ; i++)
- {
- if (temp != -)
- {
- rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks));//初始化随机类
- }
- int t = rand.Next();//获取随机数
- if (temp != - && temp == t)
- {
- return RndNum(VcodeNum);//如果获取的随机数重复,则递归调用
- }
- temp = t;//把本次产生的随机数记录起来
- code += VcArray[t];//随机数的位数加一
- }
- return code;
- }
- /// <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 * , );
- g = Graphics.FromImage(Img);//从Img对象生成新的Graphics对象
- g.Clear(Color.White);//背景设为白色
- //在随机位置画背景点
- for (int i = ; i < ; i++)
- {
- int x = random.Next(Img.Width);
- int y = random.Next(Img.Height);
- g.DrawRectangle(new Pen(Color.LightGray, ), x, y, , );
- }
- //验证码绘制在g中
- for (int i = ; i < code.Length; i++)
- {
- int cindex = random.Next();//随机颜色索引值
- int findex = random.Next();//随机字体索引值
- Font f = new Font(fonts[findex], , FontStyle.Bold);//字体
- Brush b = new SolidBrush(c[cindex]);//颜色
- int ii = ;
- if ((i + ) % == )//控制验证码不在同一高度
- {
- ii = ;
- }
- g.DrawString(code.Substring(i, ), f, b, + (i * ), ii);//绘制一个验证字符
- }
- MemoryStream ms = new MemoryStream();//生成内存流对象
- Img.Save(ms, ImageFormat.Jpeg);//将此图像以Png图像文件的格式保存到流中
- ms.Seek(, SeekOrigin.Begin);//指针回归
- //回收资源
- g.Dispose();
- Img.Dispose();
- return ms;
- }
找背景图参考:http://beijing.gongjuji.net/
更多:
.Net Core Bitmap位图处理的更多相关文章
- 重温delphi之:如何将Bitmap位图与base64字符串相互转换
先引用delphi自带的单元 uses EncdDecd; 然后就可以使用下面二个函数了: by 菩提树下的杨过 http://yjmyzz.cnblogs.com/ ///将Bitmap位图转化为b ...
- delphi中Bitmap位图与base64字符串相互转换
uses EncdDecd; ///将Bitmap位图转化为base64字符串 function BitmapToString(img:TBitmap):string ; var ms:TMemory ...
- bittorrent 学习(一) 种子文件分析与bitmap位图
终于抽出时间来进行 BITTORRENT的学习了 BT想必大家都很熟悉了,是一种文件分发协议.每个下载者在下载的同时也在向其他下载者分享文件. 相对于FTP HTTP协议,BT并不是从某一个或者几个指 ...
- 【Bitmap Index】B-Tree索引与Bitmap位图索引的锁代价比较研究
通过以下实验,来验证Bitmap位图索引较之普通的B-Tree索引锁的“高昂代价”.位图索引会带来“位图段级锁”,实际使用过程一定要充分了解不同索引带来的锁代价情况. 1.为比较区别,创建两种索引类型 ...
- Bitmap 位图
转自: http://dongxicheng.org/structure/bitmap/ 1. 概述 位图(bitmap)是一种非常常用的结构,在索引,数据压缩等方面有广泛应用.本文介绍了位图的实现 ...
- 使用不安全代码将 Bitmap 位图转为 WPF 的 ImageSource 以获得高性能和持续小的内存占用
在 WPF 中将一个现成的 Bitmap 位图转换成 ImageSource 用于显示一个麻烦的事儿,因为 WPF 并没有提供多少可以转过来的方法.不过产生 Bitmap 来源却非常多,比如屏幕截图. ...
- ( 转 ) 数据库BTree索引、Hash索引、Bitmap位图索引的优缺点
测试于:MySQL 5.5.25 当前测试的版本是Mysql 5.5.25只有BTree和Hash两种索引类型,默认为BTree.Oracle或其他类型数据库中会有Bitmap索引(位图索引),这里作 ...
- BitMap位图
BitMap位图算法https://blog.csdn.net/varyall/article/details/79662029 常见面试题 题1:在2.5亿个整数找出不重复的整数,内存不足以容纳着2 ...
- 【读书笔记《Android游戏编程之从零开始》】14.游戏开发基础(Bitmap 位图的渲染与操作)
Bitmap 是图形类,Android 系统支持的图片格式有 png.jpg.bmp 等. 对位图操作在游戏中是很重要的知识点,比如游戏中需要两张除了大小之外其他完全相同的图,那么如果会对位图进行缩放 ...
随机推荐
- 字符串匹配的kmp算法 及 python实现
一:背景 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题. Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的常 ...
- 常用的服务发现对比(Consul、zookeeper、etcd、eureka)
这里就平时经常用到的服务发现的产品进行下特性的对比,首先看下结论: Feature Consul Zookeeper Etcd Eureka 服务健康检查 服务状态,内存,硬盘等 (弱)长连接 ...
- django 2.0 中URL的include方法使用分析
一.问题出现: 在使用Django2.0,配置全局URL时,希望指向某个APP的URL,配置如下: from django.contrib import admin from django.conf. ...
- springmvc中使用MockMvc测试controller
示例代码 import com.alibaba.fastjson.JSONObject; import org.junit.Before; import org.junit.Test; import ...
- Java文件类
在Java语言中,无论是目录还是文件,都抽象成java.io.File类 直接上示例吧 java,io,File的常用操作 删除.创建 因为我的e盘里面是没有这个文件的,所以不存在I哦 创建文件: 获 ...
- [转]C++实现平衡二叉树
作者:Rest探路者 出处:http://www.cnblogs.com/Java-Starter/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意请保留此段声明,请在文章页面明显位置给出原文 ...
- [代码审计]yxcms从伪xss到getshell
0x00 前言 这篇文章首发于圈子,这里作为记录一下. 整个利用链构造下来是比较有趣的,但实际渗透中遇到的几率比较少. 此次审的是yxcms 1.4.6版本,应该是最后一个版本了吧? 0x01 从任意 ...
- 有多少种JVM
https://en.wikipedia.org/wiki/Comparison_of_Java_virtual_machines 在这个类别下,主流选择有:(按流行程度递减) HotSpot VM ...
- Android任务和返回栈完全解析(转)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/41087993 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工 ...
- 使用 IntraWeb (14) - 基本控件之 TIWHRule、TIWRectangle
TIWHRule //一条横线, 对应 Html 中的 <hr/> TIWRectangle //矩形; 中间可以有行文本, 文本可任意对齐 TIWHRule 所在单元及继承链: IWHT ...