截止.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/

更多:

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. 1195: [HNOI2006]最短母串

    思路:好像以前谁问过我这题...  状个压就好啦, 把包含在其他串中的字符串删掉, 预处理除每两个字符串之间的关系, dp[ state ][ i ] 表示在state的状态下, 最后一个字符串是第i ...

  2. shell编程快速入门及实战

    shell编程:对于hadoop程序员,通常需要熟悉shell编程,因为shell可以非常方便的运行程序代码. 1.shell文件格式:xxx.sh #!/bin/sh ---shell文件第一行必须 ...

  3. Stable Match

    稳定婚姻问题 主要就是处理两个数组 boy[i][j]    存放第i个男的第j喜欢的女的   存的是女的编号!! girl[i][j]   存放 第i个女的对第j个男的的好感度  存的是值 然后只要 ...

  4. P1375 小猫(二飞的小憨猫)

    P1375 小猫(二飞的小憨猫)连两个点,就把一个多边形,分成了两部分,这两部分的点一定得是偶数,这样就可以递推啦,比如h[5]==h[4][0]+h[3][1]+h[2][2]+h[1][3]+h[ ...

  5. django 项目运行时static静态文件不能加载问题处理

    一.首先检查网页中的加载路径是否正确,如果和文件所在路径不一致,就把html改下路径 二.加载路径和文件实际路径一致,看下配置文件: STATIC_URL = '/static/'STATIC_ROO ...

  6. Spring Cache缓存技术的介绍

    缓存用于提升系统的性能,特别适用于一些对资源需求比较高的操作.本文介绍如何基于spring boot cache技术,使用caffeine作为具体的缓存实现,对操作的结果进行缓存. demo场景 本d ...

  7. 浅谈2-SAT(待续)

    2-SAT问题,其实是一个逻辑互斥问题.做了两道裸题之后仔细想来,和小时候做过的“有两个女生,如果A是女生,那么B一定不是女生.A和C性别相同,求A.B.C三人的性别.”几乎是一样的. 对于这道题我们 ...

  8. 每日踩坑 2018-09-29 .Net Core 控制器中读取 Request.Body

    测试代码: 结果: PostMan: 代码: private string GetRequestBodyUTF8String() { this.Request.EnableBuffering(); ; ...

  9. AIM Tech Round 3 (Div. 1) B. Recover the String 构造

    B. Recover the String 题目连接: http://www.codeforces.com/contest/708/problem/B Description For each str ...

  10. 【shell学习笔记】curl命令总结

    2014-12-16 20:34 文思海辉 =========== CURL命令总结 1. 下载 curl -o [文件名称] www.baidu.com 2. 显示 HTTP request头信息 ...