好好学习,天天向上,一流范文网欢迎您!
当前位置: >> 最新范文 内容页

适用于VS2022.NET6.0(版本3.1.0)的二维码编码器和解码器C#解释器

适用于VS2022.NET6.0(版本3.1.0)的二维码编码器和解码器C#解释器

本文转载自CodeProject上的一篇博文适用于VS2022.NET6.0(版本3.1.0)的二维码编码器和解码器C#泛型,作者是UziGranot

QRCode库容许程序创建二维码图象或读取(解码)包含一个或多个二维码的图象。

QRCode库容许程序创建(编码)二维码图象,或读取(解码)包含一个或多个二维码的图象。代码已升级到VS2022和.NET6.0。

介绍

QRCode库容许您的程序创建(编码)二维码图象或读取(解码)包含一个或多个二维码的图象。附送的源代码由两个解决方案组成,一个QRCode编码器解决方案和一个QRCode解码器解决方案。软件升级到VS2022.NET6.0。源代码是用C#编撰的。它是一个开源代码。

请注意“QRCode”一词是DENSOWAVEINCORPORATED的注册商标。

编码解决方案解码解决方案安装

附送的源代码由两个VisualStudio解决方案组成。每位解决方案都由一个库项目和演示/测试项目组成。

将代码集成到您的应用程序须要执行以下步骤。在您的开发区域安装QRCodeEncoderLibrary.dll或QRCodeDecoderLibrary.dll。启动VisualStudioC#程序并打开您的应用程序。转入SolutionExplorer,右键单击References,之后选择AddReference。选择浏览选项卡并将文件系统导航到所需库的位置。当发布应用程序时,必须包含相关库文件并将其安装在与可执行文件(.exe)相同的文件夹中。

或则,您可以将相关库的源文件复制到您的项目中。

必须将相关的“using”语句添加到所有源文件中:

using QRCodeEncoderLibrary;
// or
using QRCodeDecoderLibrary;

二维码

二维码代表快速响应代码。它是一个二维条形码。从视觉上看,它是由黑白相间的方块组成的正圆形。正圆形周围是一片红色的静谧地带。二维码由国际标准ISO/IEC18004定义。可在此处免费获得该标准的副本。

ISO标准文件将二维码定义为“二维码是一个矩阵,由一系列以整体圆形纹样排列的标称圆形模块组成,包括坐落符号三个角的奇特定位纹样,借以帮助轻松定位它的位置、大小和倾斜度。提供了广泛的符号大小范围以及四个级别的纠错。模块规格由用户指定,以支持通过多种技术生成符号。

ISO标准18004是了解二维码细节的最佳信息来源。在互联网上搜索可以找到更多关于该主题的文章。关于二维码的维基百科文章可以在这儿查看。

二维码标准是40个不同大小的小方块的集合。每位小方块都有一个从1到40的版本号。每位小方块的大小从21x21个模块(版本1)到177x177个模块(版本40)不等。每位版本的每条边比先前的版本多4个模块。

Square-Dimension = 21 + 4 * (Version - 1)

一些模块是固定的。最显著的是三小方块侦测器。其余模块分为数据和纠错。有4个级别的纠错:

数据区中的每位模块代表一位。红色模块为1,黑色模块为0。数据区可分为段。每位输入段字节字段都以数字、字母数字和字节三种方法之一编码为数据位。注意:二维码标准还有一种汉字字符编码方式。该项目不支持它。

除数据外,二维码还可以包含ECI分配编号。分配编号范围为0到999999。该编号不是二维码数据的一部份。它用于按照字节值的取代解释(比如,取代字符集)对数据进行编码。

该程序剖析每位数据段以找到“最佳”编码。倘若您想减少二维码的大小而且您有如上定义的长串数字或字母数字数据,请将您的输入分成几个字符串或字节链表。其中一些字符串必须仅为数字或如上定义的字母数字。在解码过程中,所有结果string段将联接在一起。

当库解码包含一个或多个二维码的图象时,结果将是一个strings链表或字节链表链表。每位链表项是一个二维码。

二维码编码

编码的主要类是QREncoder.它将字节链表或文本字符串转换为二维码图象。要创建二维码图象,请根据以下步骤操作:

创建·QREncoder·对象。设置两个可选参数。纠错码和ECI分配编号。这个对象是可重用的。假如你想创建好多二维码,就复用这个对象。没有初始化或处置要求。可选参数将保留先前运行时的值。

二维码解码器_二维码解码器手机版_二维码解码器在线转换

// create QR Code encoder object
QRCodeEncoder Encoder = new();

假如须要,设置两个可选参数:

// Error correction
// error correction low (7%)
Encoder.ErrorCorrection = ErrorCorrection.L;
// or, error correction medium (15%) The Default
Encoder.ErrorCorrection = ErrorCorrection.M;
// or, error correction quarter (25%)
Encoder.ErrorCorrection = ErrorCorrection.Q;
// or, error correction high (30%)
Encoder.ErrorCorrection = ErrorCorrection.H;
// ECI Assignment Value (default is -1 not used)
// The ECI value is a number in the range of 0 to 999999.
// or -1 if it is not used
Encoder.ECIAssignValue = -1;

更高的纠错比率可以更好地保护二维码图象免受损毁。代价是降低了二维码符号的大小。

调用四种Encode方式之一:

// single text string input
public void Encode(string StringDataSegment);
// multiple text strings input
public void Encode(string[] StringDataSegments);
// single byte array input

二维码解码器_二维码解码器手机版_二维码解码器在线转换

public void Encode(byte[] ByteDataSegment); // multiple byte arrays input public void Encode(byte[][] ByteDataSegments);

倘若输入数据是文本字符串,或文本字符串字段。文本将使用以下方式转换为字节字段。

// the encoder converts text string to byte array
// using the conversion method
byte[] ByteArray = Encoding.UTF8.GetBytes(Text);

实际上二维码解码器,库软件会将第一种和第二种Encode方式分别转换为第三种和第四种方式。

将QRCodeEncoderLibrary扫描每位传入数据字节字段段以确定最佳编码方式。该程序不会尝试打断单个段以最小化二维码矩阵的大小。您可以递交段链表以借助长字符串的数字或字母数字数据。

该Encode方式返回一个bool[,]布尔元素链表的方阵。返回的二维bool链表也可以作为类QRCodeMatrix的公共成员使用QREncode。每位元素将红色模块表示为true,将黑色模块表示为false。在公共成员变量中矩阵维度使用QRCodeDimension。假如编码失败,将抛出异常。

下一步是将二维码符号保存到文件中,或则创建一个Bitmap.以下示例显示怎样将保存QRCodeMatrix到PNG图象文件。将二维码图片保存为PNG文件不须要使用Bitmap类,适用于net-core和net-standard。对于PNG图象文件来说,Bitmap显著要大于QRSaveBitmapImage。

// save image as png file
// create save PNG image class 
// and load the QR Code matrix 
QRSavePngImage PngImage = new(QRCodeMatrix);
// set the module size in pixels
PngImage.ModuleSize = ModuleSize;
// set the quiet zone in pixels
PngImage.QuietZone = QuietZone;
// save the QR Code PNG image to file name
// or to open file stream
PngImage.SaveQRCodeToPngFile(Dialog.FileName);

使用Bitmap类保存二维码。Bitmap类容许您选择文件格式。

// save image as any file format supported by Bitmap class.

二维码解码器在线转换_二维码解码器手机版_二维码解码器

// create image class for the QR Code matrix QRSaveBitmapImage Image = new(QRCodeMatrix); // set the module size in pixels Image.ModuleSize = ModuleSize; // set the quiet zone in pixels Image.QuietZone = QuietZone; // save the QR Code image to file name // or to open file stream Image.SaveQRCodeToBitmapFile(Dialog.FileName, ImageFormat);

使用命令行类创建PNG图象文件。

下边列举了命令行参数。参数设置编码选项。

命令行参数格式:

QR码编码器演示

QRCodeEncoderDemo是一个测试程序,展示了怎样对二维码进行编码并将其保存为图象文件。

QR码编码器演示

QR码保存对话框

保存特殊二维码图象

二维码解码

QRDecoder将包含二维码符号的图象文件或位图转换为QRCodeResult.每位结果项包含二维码数据字节链表和ECI分配值。要解码包含一个或多个二维码图象的图象文件,请根据以下步骤操作。

创建QRDecoder对象。这个对象是可重用的。假如你想解码一些图象,只需重用这个对象。没有初始化或处置要求。

// create QR Code decoder object
QRDecoder Decoder = new QRDecoder();
// call image decoder method with file name
QRCodeResult[] ResultArray = Decoder.ImageDecoder(FileName)

二维码解码器在线转换_二维码解码器_二维码解码器手机版

每位二维码符号解码成功,则将返回一个QRCodeResult元素。在大多数情况下,它将是一个元素的字段。结果定义如下。DataArray代表二维码的内容。并且在个别情况下,您可能对其他成员感兴趣。假如返回值为null,则没有检查到二维码。

// QR Code result 
public class QRCodeResult
    {
    // QR Code Data array
    public byte[] DataArray;
    // ECI Assignment Value
    public int ECIAssignValue;
    // the next members are for information only
    // QR Code matrix version
    public int QRCodeVersion;
    // QR Code matrix dimension in bits
    public int QRCodeDimension;
    // QR Code error correction code (L, M, Q, H)
    public ErrorCorrection ErrorCorrection;
    }

要将数据字节链表QRCodeResult.DataArray转换成为文本字符串,请使用:

// convert binary result to text string
string TextResult = QRCode.ByteArrayToStr(ResultArray[Index].DataArray);

ByteArrayToStr方式根据如下形式将字节链表转换为字符串

// The QRDecoder converts byte array to text string 
// using this conversion
public static string ByteArrayToStr(byte[] DataArray)
	{
	Decoder = Encoding.UTF8.GetDecoder();
	int CharCount = Decoder.GetCharCount(DataArray, 0, DataArray.Length);
	char[] CharArray = new char[CharCount];
	Decoder.GetChars(DataArray, 0, DataArray.Length, CharArray, 0);
	return new string(CharArray);
	}

比如,右图有两个二维码,一个嵌套在另外一种。大的二维码数据是:BigQRCode,小的二维码数据是:SmallQRCode。大的将纠错设置为高。该程序将找到两个QR码并使用纠错来恢复大QR码的缺位区域以获得正确的内容。

QR Code 1
Big QR Code
QR Code 2
Small QR Code

另外一个三个二维码的反例。解码器在图片中找到了9个查找器。9个查找器中的所有可能的3个都经过测试。结果是三组三个发觉者测试有效的二维码结构。结果如右图所示。

QR Code 1
Top left corner
QR Code 2
Top right corner
QR Code 3
Bottom left corner

二维码解码器示例

QRCodeDecoderDemo是一个测试程序,展示了怎样扫描图象文件或视频图象以获得二维码。接出来二维码解码器,它将展示怎样将解码后的数据转换为文本字符串。视频解码器是一个测试/演示应用程序,它将使用您系统中第一个找到的网路摄像头。结合二维码解码器和摄像机图象捕获的演示程序。摄像机软件基于DirectShowLibrary。

请注意,我只在我自己的摄像机上测试过这个应用程序。我的单反是雷蛇高清网路摄像头C615。我使用的帧大小为640x480象素。

该程序将单反软件设置为在屏幕的预览区域中显示视频流。扫描速率为每秒5帧。每位帧都被捕获并测试二维码。找到二维码后,结果将显示在解码数据文本框中。假如解码后的数据是一个URI,GoToURI按键被启用,你可以在你的默认网路浏览器上显示这个URI。

为使视频解码成功,每位二维码模块必须由几个单反象素表示。诸如,4x4或更多象素。二维码必须相当锐利、平坦且与单反平行。右图说明了软件将图象转换为正圆形的能力,取景器符号坐落正确的位置。

历史License

本文以及任何相关的源代码和文件均已获得TheCodeProjectOpenLicense(CPOL)的许可。

WrittenByUziGranot,座标:法国

该会员仍未提供简历。假定它很有趣且多种多样,而且可能与编程有关。

闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻锝夊箣閿濆憛鎾绘煕閵堝懎顏柡灞剧洴楠炴﹢鎳犻澶嬓滈梻浣规偠閸斿秶鎹㈤崘顔嘉﹂柛鏇ㄥ灠閸愨偓濡炪倖鍔﹀鈧紒顔煎缁辨挻鎷呴幓鎺嶅濠电姰鍨煎▔娑㈩敄閸曨厽宕查柛鈩冪⊕閻撳繘鏌涢锝囩畺闁革絾妞介弻娑㈡晲閸涱喛纭€缂備浇椴哥敮锟犲箖閳哄懏顥堟繛鎴炲笚閻庝即姊绘担鍛婃儓闁活剙銈稿畷浼村冀椤撶姴绁﹂梺纭呮彧缁犳垹绮诲☉銏♀拻闁割偆鍠撻埊鏇熴亜閺傚灝顏慨濠勭帛閹峰懘宕ㄦ繝鍌涙畼濠电儑绲藉ú锕€顪冩禒瀣櫜闁绘劖娼欑欢鐐烘煙闁箑鍔﹂柨鏇炲€归悡鏇㈡煛閸ャ儱濡奸柣蹇曞У娣囧﹪顢曢敐蹇氣偓鍧楁煛鐏炲墽娲撮柍銉畵楠炲鈹戦崶鈺€澹曠紓鍌氬€风粈渚€顢栭崨顖涘床闁圭増婢橀悡姗€鏌熸潏楣冩闁稿﹦鍏橀弻銈囧枈閸楃偛顫梺鍛婃煥閹诧紕鎹㈠☉姘e亾濞戞瑡缂氶柣顓滃€曢湁婵犲﹤绨肩花缁樸亜閺囶亞绋荤紒缁樼箓椤繈顢橀悢鍓蹭户闂傚倷鑳剁划顖涚仚闁诲繐绻戦悷鈺佺暦閹扮増鍊烽柣鎴炃氶幏娲煟鎼粹剝璐″┑顔炬暬婵℃挳宕橀埡鈧换鍡涙煟閹邦厽缍戞繛鎼枟椤ㄣ儵鎮欏顔煎壉濡炪倧濡囨晶妤呭箚閺冨牊鏅查柛銉╊棑鎼村﹪姊婚崒娆掑厡缂侇噮鍨跺畷婵嬫晝閸屾氨顦┑鐐叉閹稿摜绮堟径鎰厪闁割偅绻冮ˉ鎾趁瑰⿰鍕煁闁靛洤瀚伴獮妯兼崉閻╂帇鍨介弻娑樜熸笟顖氭闂侀€炲苯澧い鏃€鐗犲畷鏉库槈閵忊晜鏅悷婊勬瀹曟椽濡烽敃鈧欢鐐测攽閻愭潙鍔ら柣妤佸哺濮婃椽宕ㄦ繝浣虹箒闂佹悶鍔屽畷顒勨€﹂崸妤€绠i柨鏃囆掗幏娲煟閻樺弶澶勭憸鏉垮暣瀹曞灚娼忛埡鍐紳閻庡箍鍎遍幊蹇浰夐悙鐢电<闁稿本姘ㄥ瓭濡ゆ浜欓崡鍐茬暦閻撳寒娼╅柨婵嗘噸婢规洟姊洪崫鍕犻柛鏂跨灱濞嗐垽鎮欓悜妯煎幍闂備緡鍙忕粻鎴︾嵁閹扮増鐓欓梺鍨儐閵囨繃鎱ㄦ繝鍐┿仢鐎规洏鍔嶇换婵嬪礋椤撶姵娈奸梻浣筋嚙鐎涒晛顫濋妸鈺佺婵☆垵娅i弳锕傛煛閸ラ纾块柣銈傚亾婵犵數鍋為崹鍫曟偡瑜斿畷銏ゆ焼瀹ュ棌鎷虹紓鍌欑劍钃遍柣鎾卞劦閺岀喓鎷犺绾惧灝霉濠婂嫭鍊愰柡浣稿€块弻銊╊敍濮橆偄顥氭繝鐢靛仜閻楀棝鎮樺┑鍡忔瀺婵せ鍋撻柡灞剧〒閳ь剨缍嗘禍婊堫敂椤撶喆浜滈柕蹇婂焺閹寸姷绱﹂柣锝呯灱閻瑩鎮归幁鎺戝闁逞屽墰閸嬨倕顫忓ú顏勭閹兼番鍩勫鍨攽閳藉棗浜滈悗姘煎弮瀹曟碍绻濋崘顭戝殼闁诲孩绋掕彜闁归绮换娑欐綇閸撗呅氬┑鈽嗗亜鐎氼垶銆傞崸妤佲拻濞达絿鎳撻婊呯棯閺夎法效濠碉紕鏁诲畷鐔碱敍濞戞瑦鐝曢梺鑽ゅТ濞测晛顕i幘璇茬獥濠电姴浼i弮鍫熷亹闂傚牊绋愬▽顏堟⒑閸涘﹥鈷愰柣鐔村劦閹箖鎮滈挊澹┾晠鏌嶉崫鍕舵敾闁哄應鏅犲娲川婵犲啫鐦烽柣蹇曞仩婵倕鈻嶅Δ鍛拻闁稿本鐟чˇ锕傛煙绾板崬浜伴挊婵囥亜閺嶎偄浠﹂柛瀣儔閺屾盯鍩勯崗鈺傚灥閳诲秹鎮╃紒妯煎幗闂佹寧绻傞幊鎰版倶闁秵鐓熸い鎾跺枑瀹曞矂鏌$仦鍓ф创妞ゃ垺娲熼弫鎰板幢濞嗘ɑ袨闂傚倷鑳剁划顖炲箰婵犳碍鍋¢柍鍝勬噹閽冪喐绻涢幋娆忕仼缂佺媴绲剧换娑㈠幢濡ゅ啰鐣鹃梺绋款儐閹瑰洤顕f禒瀣垫晝闁绘棁娓规竟鏇炩攽椤旂粨缂氶柛瀣尵閳ь剚鐔幏锟�59%闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁惧墽鎳撻—鍐偓锝庝簼閹癸綁鏌i鐐搭棞闁靛棙甯掗~婵嬫晲閸涱剙顥氬┑掳鍊楁慨鐑藉磻閻愮儤鍋嬮柣妯荤湽閳ь兛绶氬鎾閳╁啯鐝曢梻浣藉Г閿氭い锔诲枤缁辨棃寮撮悢铏圭槇闂佹眹鍨藉ḿ褍鐡梻浣瑰濞插繘宕愬Δ鍛劦妞ゆ帊绀侀崵顒勬煕閿濆繒绉┑鈩冩尦瀹曘劑寮堕幋鐘靛幀濠电姰鍨煎▔娑㈡偋閸涱垵濮冲┑鐘崇椤ュ﹥銇勯幇鈺佺仾濠㈣泛瀚伴弻鐔煎川婵犲啫鈧劙鏌熼鐐毄闁逞屽墾缂嶅棝宕板Δ鍛亗闁靛濡囩弧鈧梻鍌氱墛缁嬫帡鏁嶅鍡曠箚闁圭粯甯楅幉鍝ョ磼鏉堛劌娴柛鈹惧亾濡炪倖甯掗崐鐢稿磻閹剧粯鏅查幖绮光偓鑼寜濠电偛鐡ㄧ划宥囧垝閹捐钃熼柣鏃傚帶缁犳煡鏌熼柇锕€骞橀柕鍡樺姍濮婃椽宕崟闈涘壈闂備礁搴滅紞浣割嚕婵犳碍鏅查柛娑变簼閺傗偓闂備礁鎲℃笟妤呭储閼测晝鐭堟い鏂跨毞閺€鑺ャ亜閺冨倶鈧螞濮橆厾绠鹃柛婊冨暟缁夘喗顨ラ悙鏉戠伌鐎规洜鍠栭、娑樞掔亸鏍ㄦ珚闁哄本娲樺鍕槈濮楀棙鍠橀柣鐔哥矌婢ф鐣濈粙娆炬綎缂備焦蓱婵挳鏌i幋鐏活亜鈻撳畝鍕拺闁硅偐鍋涢埀顒佺墵閹囨偐閼姐倕绁﹂棅顐㈡处缁嬫帡寮查幖浣圭叆闁绘洖鍊圭€氾拷