.Net Core Bitmap位图处理
2024-08-24 21:46:43
截止.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/
更多:
最新文章
- MySql分页算法
- Javascript运动基础
- 使用ajax预加载图片
- hdu 5269 ZYB loves Xor I
- Centos5下安装监控工具nmon
- 了解 XSS 攻击原理
- python第十二天-----RabbitMQ
- Hash与Map
- Python之str(),repr(),``
- ARM指令协处理器处理指令
- 将Ecshop后台fckeditor升级更改为kindeditor 4.1.10编辑器
- 图的两种遍历:DFS&;BFS
- Nagios安装、配置、问题记录
- 第三十八天 GIL 进程池与线程池
- 使用vscode 编写Markdown文件
- Wireshark常用过滤使用方法
- windows 日志解决方法
- greenlet
- Linux驱动之建立一个hello模块
- 安装中文输入法 ubuntu shortcut desktop
热门文章
- react 15
- httpclient初步封装
- 一个页面从输入URL 到页面加载显示完成,这个过程中都发生了什么?
- FTP传输一定要注意使用二进制模式
- c# dapper mysql like 参数化
- 研究table-cell和overflow
- Understanding the STM32F0&#39;s GPIO
- There are no packages available for install
- C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\文件不断增长,如何处理?
- LINUX 源码+内核所有参数说明