首页 > 编程语言 >C#轻松实现条形码二维码生成及识别

C#轻松实现条形码二维码生成及识别

时间:2025-01-14 13:44:02浏览次数:1  
标签:条形码 writer C# pic Bitmap int 二维码 new

一、前言

大家好!我是付工。

今天给大家分享一下,如何基于C#来生成并识别条形码或者二维码。

二、http://ZXing.Net

实现二维码生成的库有很多,我们这里采用的是http://ZXing.Net

ZXing是一个开放源码的,用Java实现的多种格式的一维二维条码图像处理库,而http://ZXing.Net是ZXing在.Net平台下的实现。

我们通过Nuget搜索http://zxing.net即可搜索安装。

三、BarCodeHelper

安装好http://ZXing.Net后,我们创建一个BarCodeHelper,对于进行封装,封装了以下几个方法:

方法一:生成条形码

public static Bitmap GenerateBarCode(string text, int width, int height)
{
    BarcodeWriter writer = new BarcodeWriter();
    writer.Format = BarcodeFormat.CODE_39;
    EncodingOptions options = new EncodingOptions()
    {
        Width = width,
        Height = height,
        Margin = 2,
        PureBarcode = true
    };
    writer.Options = options;
    Bitmap map = writer.Write(text);
    return map;
}

方法二:生成二维码

public static Bitmap GenerateQRCode(string text, int width, int height)
{
    BarcodeWriter writer = new BarcodeWriter();
    writer.Format = BarcodeFormat.QR_CODE;
    QrCodeEncodingOptions options = new QrCodeEncodingOptions()
    {
        DisableECI = true,//设置内容编码
        CharacterSet = "UTF-8",  //设置二维码的宽度和高度
        Width = width,
        Height = height,
        Margin = 1//设置二维码的边距,单位不是固定像素
    };
    writer.Options = options;

    Bitmap map = writer.Write(text);
    return map;
}

方法三:生成带Logo二维码:

public static Bitmap GenerateQRCodeWithLogo(string text, int width, int height, Bitmap logo)
{
    //构造二维码写码器
    MultiFormatWriter writer = new MultiFormatWriter();
    Dictionary<EncodeHintType, object> hint = new Dictionary<EncodeHintType, object>();
    hint.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
    hint.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
    //生成二维码 
    BitMatrix bm = writer.encode(text, BarcodeFormat.QR_CODE, width, height, hint);
    BarcodeWriter barcodeWriter = new BarcodeWriter();
    Bitmap map = barcodeWriter.Write(bm);
    //获取二维码实际尺寸
    int[] rectangle = bm.getEnclosingRectangle();
    //计算插入图片的大小和位置
    int middleW = Math.Min((int)(rectangle[2] / 3.5), logo.Width);
    int middleH = Math.Min((int)(rectangle[3] / 3.5), logo.Height);
    int middleL = (map.Width - middleW) / 2;
    int middleT = (map.Height - middleH) / 2;
    Bitmap bmpimg = new Bitmap(map.Width, map.Height, PixelFormat.Format32bppArgb);
    using (Graphics g = Graphics.FromImage(bmpimg))
    {
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
        g.DrawImage(map, 0, 0, width, height);
    }
    //将二维码插入图片
    Graphics myGraphic = Graphics.FromImage(bmpimg);
    //白底
    myGraphic.FillRectangle(Brushes.Transparent, middleL, middleT, middleW, middleH);
    myGraphic.DrawImage(logo, middleL, middleT, middleW, middleH);
    return bmpimg;
}

方法四:识别条码二维码:

public static string ReadCode(Bitmap bitmap)
{
    BarcodeReader barcodeReader = new BarcodeReader();
    barcodeReader.Options.CharacterSet = "UTF-8";
    Result result = barcodeReader.Decode(bitmap);
    return result.Text;
}

四、案例应用

有了以上方法后,编写一个案例来进行功能测试。

按钮事件代码很简单,就是调用BarCodeHelper中的对应方法即可:

private void btn_BarCode_Click(object sender, EventArgs e)
{
    this.pic_BarCode.Image = BarCodeHelper.GenerateBarCode(this.txt_BarCode.Text, this.pic_BarCode.Width, this.pic_BarCode.Height);
}

private void btn_QRCode_Click(object sender, EventArgs e)
{
    if (chk_Logo.Checked)
    {
        this.pic_QRCode.Image = BarCodeHelper.GenerateQRCodeWithLogo(this.txt_QRCode.Text,
this.pic_QRCode.Width, this.pic_QRCode.Height, new Bitmap(this.pic_Logo.Image));
    }
    else
    {
        this.pic_QRCode.Image = BarCodeHelper.GenerateQRCode(this.txt_QRCode.Text, this.pic_QRCode.Width, this.pic_QRCode.Height);
    }
}

private void btn_ReadQRCode_Click(object sender, EventArgs e)
{
    MessageBox.Show(BarCodeHelper.ReadCode(new Bitmap(this.pic_QRCode.Image)));
}

private void btn_ReadBarCode_Click(object sender, EventArgs e)
{
    MessageBox.Show(BarCodeHelper.ReadCode(new Bitmap(this.pic_BarCode.Image)));
}

最终实现效果如下所示:

标签:条形码,writer,C#,pic,Bitmap,int,二维码,new
From: https://www.cnblogs.com/xbdedu/p/18670606

相关文章

  • 车辆总线接口设备 - VCI
    概述    TESTBASE-VCI(VehicleCommunicationInterface)系列产品是经纬恒润自主研发的一组用于汽车或工业等应用领域的便携式现场通信总线接口设备,可与PC端INTEWORK系列软件配合使用,实现总线监控、测量标定和诊断刷写等功能。TESTBASE-VCI产品系列包含V60//V80/V90三代产......
  • 打卡信奥刷题(599)用C++信奥P7852[普及组/提高] 「EZEC-9」Yet Another Easy Problem
    「EZEC-9」YetAnotherEasyProblem题目描述给定n,mn,mn,m,你需要输出一个长度为......
  • Oracle 23ai新特性:使用列别名的 GROUP BY 和 HAVING 子句
    摘要随着数据库技术的不断发展,SQL语言也在不断进化,以更好地满足数据查询和分析的需求。本文将探讨如何在SQL查询中使用列别名(columnalias)或列位置(columnposition)来简化GROUPBY和HAVING子句,并提高查询的可读性和维护性。一、引言在SQL查询中,GROUPBY子句用于将......
  • NLP 进阶:BERT + CRF 用于命名实体识别(NER)
    引言:命名实体识别(NER)是自然语言处理(NLP)中的一项关键任务,它帮助我们从文本中识别出具有特定意义的实体,例如人名、地名、组织机构等。在许多NER任务中,结合BERT和CRF(条件随机场)提供了强大的性能提升。今天,我们将深入探讨如何将BERT与CRF结合,打造一个高效、精准的命名实......
  • NLP 进阶:BERT + CNN 结合打造高效文本分类模型!
    引言:在自然语言处理(NLP)中,文本分类任务是一个核心问题,涵盖了情感分析、新闻分类、垃圾邮件检测等多个领域。传统的深度学习方法虽然取得了一定的成效,但随着BERT(BidirectionalEncoderRepresentationsfromTransformers)和CNN(ConvolutionalNeuralNetworks)技术的出现,文本分......
  • 每日学习30分轻松掌握CursorAI:项目协作与团队开发
    项目协作与团队开发一、课程概述今天我们将学习如何在团队开发中有效使用CursorAI,提高协作效率和代码质量。1.1团队协作流程......
  • 每日学习30分轻松掌握CursorAI:Cursor插件系统与扩展功能
    Cursor插件系统与扩展功能一、课程概述今天我们将学习CursorAI的插件系统,了解如何通过插件扩展和增强IDE功能。由于CursorAI基于VSCode开发,我们可以利用丰富的VSCode插件生态系统。1.1学习目标了解插件系统原理掌握插件安装管理使用常用开发插件二、插件系统基础......
  • ABC224做题笔记
    AtcoderBegineerContest224D-8PuzzleonGraph题目大意给定一个\(9\)个顶点,\(m\)条边的图,共有八个棋子分别在\(p_1,p_2,p_3...p_8\),问最终能否让第\(i\)个棋子放在\(i\)号节点上。解题思路考虑与八数码相同的做法。将九个顶点对应的状态压缩成一个九位数,即每......
  • Oracle 如何生成连续的数字/字符/时间序列
     文章目录使用层次查询生成序列生成一个连接的数字序列生成一个间隔的数字序列生成一个连续的字符序列生成一个间隔的时间序列使用表函数生成序列创建模拟的generate_series函数使用generate_series函数生成序列使用通用表表达式生成序列生成一个......
  • C++学习 函数章节
    3函数默认参数。在C++中,函数形参列表中的形参是可以有默认值的。语法:b和c有默认值,但如果之歌值传了,还会用传入的值。注意事项:如果某个位置已经有默认值,那么从左往右必须有默认值。2.如果函数声明有默认参数,函数实现就不能有默认参数,也可以实现函数有,声明没有。(避免声明函数......