前言

随着.net不断的发展,跨平台已经成为日常,之前在图片处理使用的bitmap已经不具备跨平台的能力
那么我们之前基于bitmap使用的验证码,二维码等将受到影响,下面小编为大家带来.net7二维码跨平台完美解决方案

工具的使用

安装包:SkiaSharp.QrCode(MIT协议),ZXing.Net(Apache-2.0协议)
直接用nuget下载即可

普通二维码生成

仅需要SkiaSharp.QrCode,

    public static byte[] CreateQRCode(string content, int width, int hight){using var generator = new QRCodeGenerator();var qr = generator.CreateQrCode(content, ECCLevel.H);var info = new SKImageInfo(width, hight);using var surface = SKSurface.Create(info);var canvas = surface.Canvas;canvas.Render(qr, info.Width, info.Height);using var image = surface.Snapshot();using var data = image.Encode(SKEncodedImageFormat.Png, 100);return data.ToArray();}

webapi使用

小编的代码封装了一下,应该也很好理解,后面两个方法是小编单独封装的方便复用

    /// <summary>///  Get ordinary QR code /// </summary>/// <returns>File</returns>public IActionResult GetQRCode(string content, int width, int hight)=> FileSuccee(BarcodeHelper.CreateQRCode(content, width, hight), "png");public static IActionResult FileSuccee(byte[] bytes, string suffixContentType) => new FileContentResult(bytes, suffixContentType.FindContentTypeBySuffix());public static string FindContentTypeBySuffix(this string suffix)=> suffix switch{"jpg" => "image/jpeg","tiff" => "image/tiff","gif" => "image/gif","jfif" => "image/jpeg","png" => "image/png","tif" => "image/tiff","ico" => "image/x-icon","jpeg" => "image/jpeg","wbmp" => "image/vnd.wap.wbmp","fax" => "image/fax","net" => "image/pnetvue","jpe" => "image/jpeg","rp" => "image/vnd.rn-realpix",_ => throw new Exception("没有这个文件格式")};

带图片的二维码生成

相对来说还是需要一点基础,好在小编已经帮大家踩了,无脑复制就可以用了

using SkiaSharp.QrCode;
using SkiaSharp;
using System.Text;namespace Blog.Fu.Common.Helper.MyBarcode;
public class BarcodeHelper
{public class QRCodeConfig{public string Text { get; set; } = default!;public int Width { get; set; }public int Height { get; set; }public byte[]? LogoImgae { get; set; }public int KeepWhiteBorderPixelVal { get; set; } = -1;public string BackgroundColor { get; set; } = "ffffff";public string CodeColor { get; set; } = "000000";}public static byte[] CreateQRCode(string content, int width, int hight){using var generator = new QRCodeGenerator();var qr = generator.CreateQrCode(content, ECCLevel.H);var info = new SKImageInfo(width, hight);using var surface = SKSurface.Create(info);var canvas = surface.Canvas;canvas.Render(qr, info.Width, info.Height);using var image = surface.Snapshot();using var data = image.Encode(SKEncodedImageFormat.Png, 100);return data.ToArray();}/// <summary>/// Qr code generation/// </summary>/// <param name="qRCodeConfig"></param>/// <returns></returns>/// <exception cref="ArgumentNullException">qRCodeConfig.Text not null</exception>public static byte[] CreateLogoQRCode(QRCodeConfig qRCodeConfig){qRCodeConfig.Text = qRCodeConfig.Text ?? throw new ArgumentNullException(nameof(qRCodeConfig));var keepWhiteBorderPixelVal = qRCodeConfig.KeepWhiteBorderPixelVal is >= -1 and < 10 ? qRCodeConfig.KeepWhiteBorderPixelVal : -1;var width = qRCodeConfig.Width is > 100 and < 1200 ? qRCodeConfig.Width : 500;var height = qRCodeConfig.Height is > 100 and < 1200 ? qRCodeConfig.Height : 500; ;Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);var qRCodeWriter = new ZXing.QrCode.QRCodeWriter();var hints = new Dictionary<ZXing.EncodeHintType, object>{{ ZXing.EncodeHintType.CHARACTER_SET, "UTF-8" },{ ZXing.EncodeHintType.QR_VERSION, 8 },{ ZXing.EncodeHintType.ERROR_CORRECTION, ZXing.QrCode.Internal.ErrorCorrectionLevel.H }};var bitMatrix = qRCodeWriter.encode(qRCodeConfig.Text, ZXing.BarcodeFormat.QR_CODE, width, height, hints);var w = bitMatrix.Width;var h = bitMatrix.Height;var sKBitmap = new SKBitmap(w, h);var blackStartPointX = 0;var blackStartPointY = 0;var blackEndPointX = w;var blackEndPointY = h;using var sKCanvas = new SKCanvas(sKBitmap);var sKColorBlack = SKColor.Parse(qRCodeConfig.CodeColor);var sKColorWihte = SKColor.Parse(qRCodeConfig.BackgroundColor);sKCanvas.Clear(sKColorWihte);var blackStartPointIsNotWriteDown = true;for (var y = 0; y < h; y++){for (var x = 0; x < w; x++){var flag = bitMatrix[x, y];if (flag){if (blackStartPointIsNotWriteDown){blackStartPointX = x;blackStartPointY = y;blackStartPointIsNotWriteDown = false;}blackEndPointX = x;blackEndPointY = y;sKCanvas.DrawPoint(x, y, sKColorBlack);}else{sKCanvas.DrawPoint(x, y, sKColorWihte);}}}var qrcodeRealWidth = blackEndPointX - blackStartPointX;var qrcodeRealHeight = blackEndPointY - blackStartPointY;if (keepWhiteBorderPixelVal > -1){var borderMaxWidth = (int)Math.Floor((double)qrcodeRealWidth / 10);if (keepWhiteBorderPixelVal > borderMaxWidth){keepWhiteBorderPixelVal = borderMaxWidth;}var nQrcodeRealWidth = width - keepWhiteBorderPixelVal - keepWhiteBorderPixelVal;var nQrcodeRealHeight = height - keepWhiteBorderPixelVal - keepWhiteBorderPixelVal;var sKBitmap2 = new SKBitmap(width, height);var sKCanvas2 = new SKCanvas(sKBitmap2);sKCanvas2.Clear(sKColorWihte);sKCanvas2.DrawBitmap(sKBitmap,new SKRect{Location = new SKPoint { X = blackStartPointX, Y = blackStartPointY },Size = new SKSize { Height = qrcodeRealHeight, Width = qrcodeRealWidth }},new SKRect{Location = new SKPoint { X = keepWhiteBorderPixelVal, Y = keepWhiteBorderPixelVal },Size = new SKSize { Width = nQrcodeRealWidth, Height = nQrcodeRealHeight }});blackStartPointX = keepWhiteBorderPixelVal;blackStartPointY = keepWhiteBorderPixelVal;qrcodeRealWidth = nQrcodeRealWidth;qrcodeRealHeight = nQrcodeRealHeight;sKCanvas2.Dispose();sKBitmap.Dispose();sKBitmap = sKBitmap2;}if (qRCodeConfig is { LogoImgae.Length: > 0 }){using SKBitmap sKBitmapLogo = SKBitmap.Decode(qRCodeConfig.LogoImgae);if (!sKBitmapLogo.IsEmpty){using var sKPaint2 = new SKPaint{FilterQuality = SKFilterQuality.None,IsAntialias = true};var logoTargetMaxWidth = (int)Math.Floor((double)qrcodeRealWidth / 6);var logoTargetMaxHeight = (int)Math.Floor((double)qrcodeRealHeight / 6);var qrcodeCenterX = (int)Math.Floor((double)qrcodeRealWidth / 2);var qrcodeCenterY = (int)Math.Floor((double)qrcodeRealHeight / 2);var logoResultWidth = sKBitmapLogo.Width;var logoResultHeight = sKBitmapLogo.Height;if (logoResultWidth > logoTargetMaxWidth){var r = (double)logoTargetMaxWidth / logoResultWidth;logoResultWidth = logoTargetMaxWidth;logoResultHeight = (int)Math.Floor(logoResultHeight * r);}if (logoResultHeight > logoTargetMaxHeight){var r = (double)logoTargetMaxHeight / logoResultHeight;logoResultHeight = logoTargetMaxHeight;logoResultWidth = (int)Math.Floor(logoResultWidth * r);}var pointX = qrcodeCenterX - (int)Math.Floor((double)logoResultWidth / 2) + blackStartPointX;var pointY = qrcodeCenterY - (int)Math.Floor((double)logoResultHeight / 2) + blackStartPointY;using var sKCanvas3 = new SKCanvas(sKBitmap);using var sKPaint = new SKPaint{FilterQuality = SKFilterQuality.Medium,IsAntialias = true};sKCanvas3.DrawBitmap(sKBitmapLogo,new SKRect{Location = new SKPoint { X = 0, Y = 0 },Size = new SKSize { Height = sKBitmapLogo.Height, Width = sKBitmapLogo.Width }},new SKRect{Location = new SKPoint { X = pointX, Y = pointY },Size = new SKSize { Height = logoResultHeight, Width = logoResultWidth }}, sKPaint);}}using SKImage sKImage = SKImage.FromBitmap(sKBitmap);sKBitmap.Dispose();using var data = sKImage.Encode(SKEncodedImageFormat.Png, 100);return data.ToArray();}
}

webapi案例带图片的二维码

和上面一样后面方法小编封装在其他地方方便复用

    /// <summary>///  Get with the logo QR code/// </summary>/// <returns>File</returns>public IActionResult PostLogoGetQRCode(string content, int width, int hight, IFormFile file)=> FileSuccee(BarcodeHelper.CreateLogoQRCode(new BarcodeHelper.QRCodeConfig{Text = content,Width = width,Height = hight,LogoImgae = file.FileToBytes()}), "png");/// <summary>///  File to binary/// </summary>/// <returns>byte[]</returns>public static byte[] FileToBytes(this IFormFile fileData){byte[] data;using var inputStream = fileData.OpenReadStream();if (inputStream is not MemoryStream memoryStream){memoryStream = new MemoryStream();inputStream.CopyTo(memoryStream);}data = memoryStream.ToArray();return data;}

借鉴文章

https://www.cnblogs.com/ruzi/p/10140754.html
小编有抄袭别人的代码但是有些瑕疵,已被小编完善

效果图

结尾

喜欢的宝子记得点赞,关注,小编也会持续更新

.net7二维码跨平台完美解决方案相关推荐

  1. 二维码识别超级解决方案,工业级别

    二维码识别超级解决方案,工业级别 参考文章: (1)二维码识别超级解决方案,工业级别 (2)https://www.cnblogs.com/y114113/p/6255462.html 备忘一下.

  2. 酒类质量二维码追溯系统解决方案

    酒类质量追溯.酒类二维码追溯.追溯系统解决方案.酒类溯源系统. 近期,多个省份发出酒业追溯的文件,要求结合企业自身的情况,建立酒业质量追溯,要求系统可以追溯到原材料采集.生产批次.包装.检验报告.物流 ...

  3. 扫一扫 解析二维码 的多种解决方案

    一.微信扫一扫 提到扫一扫,大家都很熟悉微信扫一扫吧,那微信扫一扫怎么接入的呢?当然这个肯定是看微信开放平台开放的api接口咯! https://mp.weixin.qq.com/wiki?t=res ...

  4. 微信|QQ扫码登录网页版二维码失效问题解决方案 网站无法访问PC网页版如何解决 安卓软件历史版本下载 FV fooview悬浮球帮助教程

    前言 1. 手机端浏览器登录网页的同时再用微信或者QQ扫码登录出现二维码失效问题如何解决? 2.部分网站无法访问PC网页版如何解决?请看方案 目录 前言 1.方案 2.方案 使用Edge安卓浏览器访问 ...

  5. APP二维码渠道统计解决方案

    小C是公司的一名地推主管,公司最近制作了自己的APP需要地面推广人员进行推广.地推进行的很顺利,可是他在统计不同区域地推进程的时候陷入了巨大的烦恼之中.他们采取全部地区是一个二维码的方式进行推广,没有 ...

  6. App二维码邀请的解决方案

    App开发完成上线之后,公司会在产品推广上投入了更多的资源,做为一名技术当然希望自己做的产品被更多的人使用.今天来看看App二维码邀请这个环节怎么来实现. 第一步 准备h5页面 1.根据自身业务设计一 ...

  7. 二维码的扫描与生成(含动态权限)

    首页 博客 学院 下载 GitChat TinyMind 论坛 问答 商城 VIP 活动 招聘 ITeye CSTO 写博客 发Chat cjm2484836553的博客 RSS订阅 原 Androi ...

  8. 二维码门禁助力于打造更智能化的出入管理-码上开门,说走就走

    随着门禁行业的逐渐成熟发展,作为智能门禁的新秀-二维码门禁以低成本.智能化.高效率的管理模式越来越受到人们的关注.特别是在智慧城市建设的呼吁下,很多写字楼.智慧社区.办公楼.酒店和公寓等场景都离不开它 ...

  9. 浅谈二维码门禁在互联网的时代特色

    在互联网发达的今天,二维码门禁应运而生,它通过利用物联网和云计算等新技术,实现对门禁系统的人员流动和行动轨迹进行一个精细化.实时性的管理模式.二维码门禁在互联网时代下,逐渐成为传统门禁的新发展点,也为 ...

最新文章

  1. BCH DEVCON 黑客马拉松即将登陆旧金山!
  2. linux搭建vsftpd虚拟用户访问
  3. win7仿linux主题,linuxmint 16 cinnamon模仿win7/win8主题
  4. MAC Pro 同时安装 Python2 和 Python3
  5. rails.vim环境安装(ubuntu)
  6. 设置域名_如何设置二级域名解析?有什么设置方法?
  7. python 虚拟环境 virtualenv virtualenvwrapper的使用方法、命令
  8. 三坐标测量圆直径_基于三坐标测量机的渐开线齿轮,测量方法
  9. PHP生成有背景的二维码图,摘自网络
  10. Golang (Go语言) Mac OS X下环境搭建 环境变量配置 开发工具配置 Sublime Text 2 【转】...
  11. 在传统以太网中,为什么要有最小帧长度和最大帧长度的限制
  12. opencv背景抠图
  13. Android下的蓝牙自动配对
  14. h5php大转盘抽奖,html5的非常简单圆形转盘抽奖代码
  15. 微信小程序接入腾讯云MQTT服务
  16. PHP 7.1 新特性一览 1
  17. 计算机常用软件英文读音,常用软件,software,音标,读音,翻译,英文例句,英语词典...
  18. 从数组到类簇的学习总结
  19. 习惯养成微信小程序的设计与实现
  20. 人体姿态骨架估计算法研究

热门文章

  1. 【论文笔记】Proofs-of-delay and randomness beacons in Ethereum-2017IEEE SB Workshop
  2. 加油卡充值 数据接口
  3. 了解MVP(最小可行产品) - 以及为什么我更喜欢最早的可测试/可用/可爱
  4. windows软件窗口或者对话框太大超出屏幕解决办法
  5. iOS11降级到iOS10.3.3/10.3.2教程
  6. 睡眠时间 数据_享受真正的安心睡眠 华米助眠耳塞Amazfit ZenBuds体验
  7. face_recognition移植至树莓派
  8. java捕鱼达人程序设计_捕鱼达人(Java版)
  9. 使用region注释,将代码块收(折叠)起来
  10. MySQL B+树 BTree原理、增删改(详细)