前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【.NET】实现生成二维码以及3种识别二维码的方式

【.NET】实现生成二维码以及3种识别二维码的方式

作者头像
用户9094469
发布2024-08-13 18:52:33
820
发布2024-08-13 18:52:33
举报
文章被收录于专栏:Dotnet Dancer

1、创建项目,并引入QRCoder包

2、输出一个简单的二维码到控制台:

代码语言:javascript
复制
QRCodeGenerator qrGenerator = new QRCodeGenerator();
QRCodeData qrCodeData = qrGenerator.CreateQrCode(data, QRCodeGenerator.ECCLevel.Q);
AsciiQRCode qrCode = new AsciiQRCode(qrCodeData);
string qrCodeAsAsciiArt = qrCode.GetGraphic(1);
Console.WriteLine(qrCodeAsAsciiArt);

3、扫码测试,使用微信扫码,也可以扫出hello,world的结果

手机扫码效果:

3、一般情况下,可能需要保存为图片,接下来换个写法,保存到本地图片:

代码语言:javascript
复制
static void GenerateQRCodeAndSave(string data, string outputPath)
        {
            QRCodeGenerator qrGenerator = new QRCodeGenerator();
            QRCodeData qrCodeData = qrGenerator.CreateQrCode(data, QRCodeGenerator.ECCLevel.Q);
            PngByteQRCode qrCode = new PngByteQRCode(qrCodeData);
            byte[] qrCodeAsPngByteArr = qrCode.GetGraphic(20);
            using (MemoryStream stream = new MemoryStream(qrCodeAsPngByteArr))
            {
                var bitmap = new Bitmap(stream);
                bitmap.Save(outputPath);
            }
        }
代码语言:javascript
复制

在根目录下就有了一个二维码图像文件:

也可以用微信扫码扫出Hello World

4、使用XZING识别二维码信息

引入ZXING.net包,然后建一个BitmapLuminanceSource类(如果新的包没有这个类的话):

代码语言:javascript
复制
public class BitmapLuminanceSource : BaseLuminanceSource
    {
        public BitmapLuminanceSource(Bitmap bitmap) : base(bitmap.Width, bitmap.Height)
        {
            var lockData = bitmap.LockBits(new Rectangle(0, 0, Width, Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            var stride = Math.Abs(lockData.Stride);
            var pixelCount = stride * Height;
            var pixels = new byte[pixelCount];
            System.Runtime.InteropServices.Marshal.Copy(lockData.Scan0, pixels, 0, pixelCount);
            bitmap.UnlockBits(lockData);

            for (int y = 0; y < Height; y++)
            {
                var offset = y * stride;
                for (int x = 0; x < Width; x++)
                {
                    var idx = offset + x * 4;
                    var luminance = (byte)(pixels[idx + 2] * 0.3 + pixels[idx + 1] * 0.59 + pixels[idx] * 0.11);
                    luminances[y * Width + x] = luminance;
                }
            }
        }

        protected override LuminanceSource CreateLuminanceSource(byte[] newLuminances, int width, int height)
        {
            throw new NotImplementedException();
        }
    }
代码语言:javascript
复制

再新建一个使用XZING.NET识别二维码的方法做测试:

代码语言:javascript
复制
static string DecodeQRCodeByZXing(string imagePath)
        {

            var barcodeReader = new BarcodeReader<Bitmap>(bitmap => new BitmapLuminanceSource(bitmap));
            var result = barcodeReader.Decode(new Bitmap(imagePath));
            if (result != null)
                return result.Text;
            return "没得码.";
        }
代码语言:javascript
复制

把上面QRCoder生成的图片,重命名为hello,然后运行程序测试一下:

5、使用OpenCV库进行识别

引入OpenCV的两个包,Emgu.CV 和 Emgu.CV.runtime.windows

编写基于OpenCV的识别方式的方法:

代码语言:javascript
复制
 
代码语言:javascript
复制
public static string DecodeQRCodeByOpenCv(string imagePath)
        {
            using (Image<Bgr, byte> img = new Image<Bgr, byte>(imagePath))
            {
                using (QRCodeDetector qrdetector = new QRCodeDetector())
                {
                    string decodedInfo = "";
                    Mat points = new Mat();
                    if (qrdetector.Detect(img, points))
                    {
                        Mat straightQrCode = new Mat();
                        decodedInfo = qrdetector.Decode(img, points, straightQrCode);
                        straightQrCode.Dispose();
                    }
                    points.Dispose();
                    return decodedInfo;
                }
            }
        }

运行并测试:

6、基于ZBar的方式

引入ZBar包

编写基于zbar的方法代码

代码语言:javascript
复制
public static string DecodeQRCodeByZbar(string imagePath)
        {
            string res = string.Empty;
            using (var scanner = new ZBar.ImageScanner())
            {
                var bitmap = (Bitmap)Image.FromFile(imagePath);
                var symbols = scanner.Scan(bitmap);
                foreach (var symbol in symbols)
                {
                    res += symbol.Data;
                }
            }
            return res;
        }

运行并测试:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Dotnet Dancer 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档