- 浏览: 182292 次
- 性别:
- 来自: 广州
文章分类
最新评论
上篇:net core Linux ( Centos 7 ) 下 验证码图片显示不出来
原因是:Unable to load shared library 'gdiplus'
但是即使安装上了这个dll,依然不能显示图片,为啥呢?
.NET Core 2.2 本身依然不包括和图片有关的 Image、Bitmap 等类型。
所以当处理图片的类中使用了ZKWeb.System.Drawing,就会提示:
Connection id "0HLPLMNTFQ8H5", Request id "0HLPLMNTFQ8H5:00000001": An unhandled exception was thrown by the application.
System.ArgumentException: No codec available for format:b96b3cae-0728-11d3-9d7b-0000f81ef32e
at System.DrawingCore.Image.Save(Stream stream, ImageFormat format)
为此百度好久,终于发现链接的文章。
此时如果你用了我的类库则只需切换到System.Drawing.Common库中并安装
或者切换为ImageSharp,就可以避免此问题。
附带图片验证码helper类 使用System.Drawing.Common库
附带前端调用
原文:https://www.cnblogs.com/stulzq/p/10172550.html
原因是:Unable to load shared library 'gdiplus'
但是即使安装上了这个dll,依然不能显示图片,为啥呢?
.NET Core 2.2 本身依然不包括和图片有关的 Image、Bitmap 等类型。
所以当处理图片的类中使用了ZKWeb.System.Drawing,就会提示:
Connection id "0HLPLMNTFQ8H5", Request id "0HLPLMNTFQ8H5:00000001": An unhandled exception was thrown by the application.
System.ArgumentException: No codec available for format:b96b3cae-0728-11d3-9d7b-0000f81ef32e
at System.DrawingCore.Image.Save(Stream stream, ImageFormat format)
为此百度好久,终于发现链接的文章。
此时如果你用了我的类库则只需切换到System.Drawing.Common库中并安装
sudo curl https://raw.githubusercontent.com/stulzq/awesome-dotnetcore-image/master/install/centos7.sh|sh
或者切换为ImageSharp,就可以避免此问题。
附带图片验证码helper类 使用System.Drawing.Common库
using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.IO; public sealed class VerifyCodeHelper { #region 单例模式 //创建私有化静态obj锁 private static readonly object _ObjLock = new object(); //创建私有静态字段,接收类的实例化对象 private static VerifyCodeHelper _VerifyCodeHelper = null; //构造函数私有化 private VerifyCodeHelper() { } //创建单利对象资源并返回 public static VerifyCodeHelper GetSingleObj() { if (_VerifyCodeHelper == null) { lock (_ObjLock) { if (_VerifyCodeHelper == null) _VerifyCodeHelper = new VerifyCodeHelper(); } } return _VerifyCodeHelper; } #endregion public enum VerifyCodeType { NumberVerifyCode, AbcVerifyCode, MixVerifyCode }; #region 数字验证码 /// <summary> /// 1.数字验证码 /// </summary> /// <param name="length"></param> /// <returns></returns> private string CreateNumberVerifyCode(int length) { int[] randMembers = new int[length]; int[] validateNums = new int[length]; string validateNumberStr = ""; //生成起始序列值 int seekSeek = unchecked((int)DateTime.Now.Ticks); Random seekRand = new Random(seekSeek); int beginSeek = seekRand.Next(0, Int32.MaxValue - length * 10000); int[] seeks = new int[length]; for (int i = 0; i < length; i++) { beginSeek += 10000; seeks[i] = beginSeek; } //生成随机数字 for (int i = 0; i < length; i++) { Random rand = new Random(seeks[i]); int pownum = 1 * (int)Math.Pow(10, length); randMembers[i] = rand.Next(pownum, Int32.MaxValue); } //抽取随机数字 for (int i = 0; i < length; i++) { string numStr = randMembers[i].ToString(); int numLength = numStr.Length; Random rand = new Random(); int numPosition = rand.Next(0, numLength - 1); validateNums[i] = Int32.Parse(numStr.Substring(numPosition, 1)); } //生成验证码 for (int i = 0; i < length; i++) { validateNumberStr += validateNums[i].ToString(); } return validateNumberStr; } #endregion #region 字母验证码 /// <summary> /// 2.字母验证码 /// </summary> /// <param name="length">字符长度</param> /// <returns>验证码字符</returns> private string CreateAbcVerifyCode(int length) { char[] verification = new char[length]; char[] dictionary = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', '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', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }; Random random = new Random(); for (int i = 0; i < length; i++) { verification[i] = dictionary[random.Next(dictionary.Length - 1)]; } return new string(verification); } #endregion #region 混合验证码 /// <summary> /// 3.混合验证码 /// </summary> /// <param name="length">字符长度</param> /// <returns>验证码字符</returns> private string CreateMixVerifyCode(int length) { char[] verification = new char[length]; char[] dictionary = { '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', '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' }; Random random = new Random(); for (int i = 0; i < length; i++) { verification[i] = dictionary[random.Next(dictionary.Length - 1)]; } return new string(verification); } #endregion #region 产生验证码(随机产生4-6位) /// <summary> /// 产生验证码(随机产生4-6位) /// </summary> /// <param name="type">验证码类型:数字,字符,符合</param> /// <returns></returns> public string CreateVerifyCode(VerifyCodeType type) { string verifyCode = string.Empty; Random random = new Random(); int length = random.Next(4, 6); switch (type) { case VerifyCodeType.NumberVerifyCode: verifyCode = GetSingleObj().CreateNumberVerifyCode(length); break; case VerifyCodeType.AbcVerifyCode: verifyCode = GetSingleObj().CreateAbcVerifyCode(length); break; case VerifyCodeType.MixVerifyCode: verifyCode = GetSingleObj().CreateMixVerifyCode(length); break; } return verifyCode; } #endregion #region 验证码图片 /// <summary> /// 验证码图片 => Bitmap /// </summary> /// <param name="verifyCode">验证码</param> /// <param name="width">宽</param> /// <param name="height">高</param> /// <returns>Bitmap</returns> public Bitmap CreateBitmapByImgVerifyCode(string verifyCode, int width, int height) { Font font = new Font("Arial", 14, (FontStyle.Bold | FontStyle.Italic)); Brush brush; Bitmap bitmap = new Bitmap(width, height); Graphics g = Graphics.FromImage(bitmap); SizeF totalSizeF = g.MeasureString(verifyCode, font); SizeF curCharSizeF; PointF startPointF = new PointF(0, (height - totalSizeF.Height) / 2); Random random = new Random(); //随机数产生器 g.Clear(Color.White); //清空图片背景色 for (int i = 0; i < verifyCode.Length; i++) { brush = new LinearGradientBrush(new Point(0, 0), new Point(1, 1), Color.FromArgb(random.Next(255), random.Next(255), random.Next(255)), Color.FromArgb(random.Next(255), random.Next(255), random.Next(255))); g.DrawString(verifyCode[i].ToString(), font, brush, startPointF); curCharSizeF = g.MeasureString(verifyCode[i].ToString(), font); startPointF.X += curCharSizeF.Width; } //画图片的干扰线 for (int i = 0; i < 10; i++) { int x1 = random.Next(bitmap.Width); int x2 = random.Next(bitmap.Width); int y1 = random.Next(bitmap.Height); int y2 = random.Next(bitmap.Height); g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2); } //画图片的前景干扰点 for (int i = 0; i < 100; i++) { int x = random.Next(bitmap.Width); int y = random.Next(bitmap.Height); bitmap.SetPixel(x, y, Color.FromArgb(random.Next())); } g.DrawRectangle(new Pen(Color.Silver), 0, 0, bitmap.Width - 1, bitmap.Height - 1); //画图片的边框线 g.Dispose(); return bitmap; } /// <summary> /// 验证码图片 => byte[] /// </summary> /// <param name="verifyCode">验证码</param> /// <param name="width">宽</param> /// <param name="height">高</param> /// <returns>byte[]</returns> public byte[] CreateByteByImgVerifyCode(string verifyCode, int width, int height) { Font font = new Font("Arial", 14, (FontStyle.Bold | FontStyle.Italic)); Brush brush; Bitmap bitmap = new Bitmap(width, height); Graphics g = Graphics.FromImage(bitmap); SizeF totalSizeF = g.MeasureString(verifyCode, font); SizeF curCharSizeF; PointF startPointF = new PointF(0, (height - totalSizeF.Height) / 2); Random random = new Random(); //随机数产生器 g.Clear(Color.White); //清空图片背景色 for (int i = 0; i < verifyCode.Length; i++) { brush = new LinearGradientBrush(new Point(0, 0), new Point(1, 1), Color.FromArgb(random.Next(255), random.Next(255), random.Next(255)), Color.FromArgb(random.Next(255), random.Next(255), random.Next(255))); g.DrawString(verifyCode[i].ToString(), font, brush, startPointF); curCharSizeF = g.MeasureString(verifyCode[i].ToString(), font); startPointF.X += curCharSizeF.Width; } //画图片的干扰线 for (int i = 0; i < 10; i++) { int x1 = random.Next(bitmap.Width); int x2 = random.Next(bitmap.Width); int y1 = random.Next(bitmap.Height); int y2 = random.Next(bitmap.Height); g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2); } //画图片的前景干扰点 for (int i = 0; i < 100; i++) { int x = random.Next(bitmap.Width); int y = random.Next(bitmap.Height); bitmap.SetPixel(x, y, Color.FromArgb(random.Next())); } g.DrawRectangle(new Pen(Color.Silver), 0, 0, bitmap.Width - 1, bitmap.Height - 1); //画图片的边框线 g.Dispose(); //保存图片数据 MemoryStream stream = new MemoryStream(); bitmap.Save(stream, ImageFormat.Jpeg); //输出图片流 return stream.ToArray(); } #endregion }
附带前端调用
string code = VerifyCodeHelper.GetSingleObj().CreateVerifyCode(VerifyCodeHelper.VerifyCodeType.NumberVerifyCode); byte[] codeImage = VerifyCodeHelper.GetSingleObj().CreateByteByImgVerifyCode(code, 100, 40);
原文:https://www.cnblogs.com/stulzq/p/10172550.html
发表评论
-
.net core Linux ( Centos 7 ) 下 验证码图片显示不出来, 或者乱码【转】
2019-09-10 12:30 876在 Linux 命令行运行: d ... -
asp.net core在CentOS上发布
2019-09-09 14:47 370CentOS环境信息: CentOS 8 生成发布文件时的参数 ... -
ASP.NET CORE读取APPSETTINGS.JSON的配置
2019-09-05 15:30 4751、首先在appsettings文件中添加我们的其他常用配置信 ... -
asp.net core 发布到iis session无法传递的问题
2019-09-04 15:04 596背景: 项目启用了session,在本地调试正常。发布到iis ... -
asp.net core在iis上发布
2019-09-04 11:43 462环境: server 2012R2 1、文件发布注意事项 c ... -
.net core 添加session信息报错
2019-09-02 16:35 720在登陆成功后添加用户信息到session中,编译不报错。运行时 ... -
ASP.NET CORE中控制器内return HTML
2019-08-30 17:51 565此处用到了Content方法 如果只是在控制器中写,那么页面 ... -
X.PagedList.Mvc.core分页(转)
2019-08-28 17:29 589详情地址:https://www.cnblogs.com/li ... -
由数据库表在 ASP.NET Core项目上生成 EF Core
2019-08-28 14:28 448通过现有数据库在 ASP.NET Core 上生成 EF Co ...
相关推荐
主要给大家介绍了关于在Linux服务器下利用Docker部署.net Core项目的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用.net Core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
腾讯支付基于.Net Core重新构建基础框架以实现更灵活可拓展 ...传统.NET确实不适合互联网,就看新一代.NET Core on Linux/docker的表演了, 腾讯支付应用微软.Net Core重新构建基础框架以实现更灵活可拓展
作为.NET 5.0版本的一部分,所有.NET Docker映像(包括.NET Core 2.1和3.1)都已过渡到下面描述的一组新的Docker存储库。为了向后兼容,将继续对旧存储库位置中的受支持标签进行更新。请更新对这些新名称的所有存储...
在项目迁移到 .net core 上面后,我们可以使用 System.Drawing.Common 组件来操作 Image,Bitmap 类型,实现生成验证码、二维码,图片操作等功能。System.Drawing.Common 组件它是依赖于 GDI+ 的,然后在 Linux 上并...
在前面文章中,介绍了 ASP.NET Core在 macOS,Linux 上基于Nginx和Jexus的发布和部署,本篇文章主要是如何在Docker容器中运行ASP.NET Core应用程序。 ASP.NET Nginx 发布和部署 :...
解决地址如下: https://blog.csdn.net/qq120631157/article/details/128672524 无积分的同学,请联系我。 1. 首先确定 k8s的版本,我的为1.20.9 ```sh kubectl get nodes ...6. 所以需要去下载 离线的docker文件。
跨平台:可在 Windows、macOS 和 Linux 操作系统上运行。 开放源代码: .NET Core 框架是开放源代码,使用 MIT 和 Apache 2 许可证。 .NET Core 是一个 .NETFoundation 项目。 现代:它实现了异步编程、使用结构的无...
C# 7 and .NET Core: Modern Cross-Platform Development - Second Edition by Mark J. Price English | 24 Mar. 2017 | ASIN: B01N8UG78Q | 594 Pages | AZW3 | 23.26 MB Modern Cross-Platform Development ...
可以运行在Windows,Linux,MacOSX等操作系统;支持Docker容器。 此项目已维护超过十年, 不断使用最合适的技术改进. 独立服务器上建议运行.NET Core版, 以获得更好的性能; 如果您没有, 可以部署到更低廉的虚拟主机, ...
能够在 IIS 、 Nginx 、 Apache 、 Docker 上进行托管或在自己的进程中进行自托管。 定目标到 .NET Core 时,可以使用并行应用版本控制。 简化新式 Web 开发的工具。 能够在 Windows 、 macOS 和 Linux 进行生成...
Core运行时版本为1.1.0,运行在Docker容器中。哎,说着说着又到技术上了,功能还没介绍完呢。说到功能,目前功能很简单:主页列出了我自己原创或者翻译的所有文章,读者可以注册用户帐号,注册用户可以发表评论,也...
使用.NET Core 3.1 LTS的ASP.NET Core和Docker的简单演示。 阅读文章 要了解如何使用此存储库,请确保您已阅读以下文章: 要求 为了运行此示例,您需要在计算机(Windows,Mac,Linux)上进行安装: Docker桌面(或...
在Docker中运行时由于linux系统中有的没有libgdiplus组件,所以在创建镜像是安装libgdiplus: 第一种办法 在Dockerfile中添加 apt-get update apt-get install libgdiplus 第二种办法 对现有的镜像做修改,然后...
额外的两个月(在.NET Core 3.0之后)使我们能够选择和实施在已经非常稳定的基础上进行的正确改进。 您可以下载适用于Windows,macOS和Linux的.NET Core 3.1: .NET Core 3.1 SDK和运行时 Docker容器映像 Snap...
Create powerful cross-platform applications using C# 6, .NET Core 1.0, ASP.NET Core 1.0, and Visual Studio 2015 About This Book Build modern, cross-platform applications with .NET Core 1.0 Get up-...
SQL部署一个用于在.NET Core和Docker环境下从SQL Project文件在MS SQL Server中创建新数据库的小项目。 不幸的是,我们不能在Linux环境下使用Microsoft SSDT创建/迁移数据库版本。 但是有时候我们想从Docker运行我们...
Aspnet-docker-dotnet-mono.zip,基于Debian Linux.docker-dotnet-mono的.NET Core和Mono的Docker映像,asp.net是一个开源的web框架,用于使用.net构建现代web应用和服务。asp.net创建基于html5、css和javascript的...
ASPNET异步通信毫无疑问,编写分布式应用程序时最流行的设计模式是Pub / Sub。...最后的想法要了解有关此应用程序,ASP.NET Core,Docker,Azure,Linux和微服务的更多信息,请访问以下博客查看我的博客:
Next, it shows you how to get started with ASP.NET Core 2 on Windows, Mac, Linux, and with Docker containers. The book illustrates what problems can occur as latency increases when deploying to a ...