C# 实现二维码详解

二维码是什么

二维码 QR Code,全称为:Quick Response Code,最早用于日本汽车制造业追踪零部件。QR现有40个标准版本,4个微型版本。相比一维码(也就是我们目前还在常用的条码),拥有更高密度的编码,可存储的信息量更大。一维码只能存储字母和数字,二维码可容纳多达1850个大写字母或者2710个数字或者1108个字符或者500多个汉字,比条码存储量多了几十倍。另外,二维码可以把图片、声音、文字、等可以数字化的信息进行编码。

除此之外:二维码比一维码译码错误率要低得多(误码率不超过千分之一),保密性、防伪性更好,成本低廉,容易制作,让二维码使用更加广泛,越来越流行。

除了存储编码的数据,QR码里还含有一些基本标准里钦定的图样来帮助扫描软件快速识别和解码。

标准(ISO/IEC 18004)里是这样说的

 更多的详解请查看这篇博客

C# 实现

首先在NuGet引入ThoughtWorks.QRCode

 生产二维码的时候用到ThoughtWorks.QRCode 的 QRCodeEncoder类

namespace ThoughtWorks.QRCode.Codec
{
    public class QRCodeEncoder
    {
        public QRCodeEncoder();

        public virtual Color QRCodeBackgroundColor { get; set; }
        public virtual ENCODE_MODE QRCodeEncodeMode { get; set; }
        public virtual ERROR_CORRECTION QRCodeErrorCorrect { get; set; }
        public virtual Color QRCodeForegroundColor { get; set; }
        public virtual int QRCodeScale { get; set; }
        public virtual int QRCodeVersion { get; set; }

        public virtual bool[][] calQrcode(byte[] qrcodeData);
        public virtual int calStructureappendParity(sbyte[] originaldata);
        public virtual Bitmap Encode(string content);
        public virtual Bitmap Encode(string content, Encoding encoding);
        public virtual void setStructureappend(int m, int n, int p);

        public enum ENCODE_MODE
        {
            ALPHA_NUMERIC = 0,
            NUMERIC = 1,
            BYTE = 2
        }
        public enum ERROR_CORRECTION
        {
            L = 0,
            M = 1,
            Q = 2,
            H = 3
        }
    }
}

ENCODE_MODE枚举是编码方式,因为我们的字符串里面可能存在中文,所以这里使用了BYTE,ALPHA_NUMERIC与NUMERIC只能编码数字

数字编码(NUMERIC):可编码0-9,10个数字,如果需要编码的数字的个数不是3的倍数,最后剩下的1或2位数会被转成4或7bits,其它的每3位数字会根据不同版本被编成 10,12,14bits

字符编码(ALPHA_NUMERIC) :可编码0-9,大写的A-Z,以及9个其他的字符(space $ % * + – . / :);

8位字节模式(BYTE) :可编码JIS X 0201的8位Latin/Kana字符集

除此之外,QR还提供了其他的编码方式,每一个编码方式都有其独有的id进行标识,这些标识会记录在数据区的前端,使得解码器可以根据二维码使用的编码方式对数据进行解码

      

 ERROR_CORRECTION枚举是容错级别

L : 最大 7% 的错误能够被纠正;

M : 最大 15% 的错误能够被纠正;

Q : 最大 25% 的错误能够被纠正;

H : 最大 30% 的错误能够被纠正;

版本信息:即二维码的规格,QR码符号共有40种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本每边增加4个模块。

177 = 21+(40-1)+4 = 21 +156.

 

 C#调用生成二维码

        /// <summary>
        /// 生成二维码
        /// </summary>
        /// <param name="strContent">二维码内容</param>
        /// <param name="qrCodeEncodeMode">编码方式</param>
        /// <param name="qrCodeScale">大小</param>
        /// <param name="qrCodeVersion">版本</param>
        /// <param name="qrCodeErrorCorrect">错误效验、错误更正</param>
        /// <returns></returns>
        public Bitmap CreateQRCodeBimap(string strContent, int qrCodeEncodeMode,int qrCodeScale,int qrCodeVersion,int qrCodeErrorCorrect)
        {
            QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
            //编码方式(BYTE能支持中文)
            qrCodeEncodeMode = qrCodeEncodeMode > 2 ? 2 : qrCodeEncodeMode;
            qrCodeEncoder.QRCodeEncodeMode = (QRCodeEncoder.ENCODE_MODE)qrCodeEncodeMode;
            //大小(值越大生成的二维码图片像素越高)
            qrCodeEncoder.QRCodeScale = qrCodeScale;
            //版本
            qrCodeEncoder.QRCodeVersion = qrCodeVersion;
            //错误效验、错误更正
            qrCodeErrorCorrect = qrCodeErrorCorrect > 3 ? 3 : qrCodeErrorCorrect;
            qrCodeEncoder.QRCodeErrorCorrect = (QRCodeEncoder.ERROR_CORRECTION)qrCodeErrorCorrect;

            return qrCodeEncoder.Encode(strContent, Encoding.GetEncoding("UTF-8"));//GB2312
        }

  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
QRCode二维码维码支持中文,网上流传很多版本都说支持中文二维码。看过测试都有问题,自己看了源码改了下。 原版本 中有 IsUnicode 方法判断是否为Unicode编码 但这个方法好像有问题 所以无法准确判断中文。可以通过改写这个来实现中文。 另外有两个方法 都可以解决中文问题 public virtual String decode(QRCodeImage qrCodeImage, Encoding encoding) public virtual String decode(QRCodeImage qrCodeImage) 因为是虚方法可以重写这个方法就可以 所以 可以通过 改写IsUnicode 和 重写 这个两个虚方法来实现 /// /// 用于判断中文 /// /// /// public static bool IsUnicode(byte[] byteData) { // This is by Joson Jiang 用于判断中文 //因为ascii编码当中的最大为127,这样判断后, //就能正确的判断是不是unicode,这样就能正确的解码中文了. bool isUnicode = false; try { foreach (byte value in byteData) { if (value > 128) { isUnicode = true; break; } } } catch (Exception) { //其中的是原本的代码 无法正确判断 中文 string value1 = FromASCIIByteArray(byteData); string value2 = FromUnicodeByteArray(byteData); byte[] ascii = AsciiStringToByteArray(value1); byte[] unicode = UnicodeStringToByteArray(value2); if (ascii[0] != unicode[0]) return true; return false; } return isUnicode;//返回是不是Unicode编码 } /// /// 重写直接返回 解决中文问题 /// public class QRCodeDecoders : QRCodeDecoder { QRCodeDecoder decoder = new QRCodeDecoder(); public override String decode(QRCodeImage qrCodeImage) { sbyte[] data = decoder.decodeBytes(qrCodeImage); byte[] byteData = new byte[data.Length]; Buffer.BlockCopy(data, 0, byteData, 0, byteData.Length); String decodedData; return decodedData = ThoughtWorks.QRCode.Codec.Util.QRCodeUtility.FromUnicodeByteArray(byteData); } } 忘了说这个是 vs2010的 原版本是 vs2005
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大鱼>

一分也是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值