node-qrcode
QR code/2d barcode generator.
Highlights
- Works on server 并且 client (and react native with svg)
- 命令行界面 utility
- 将二维码另存为图像
- Support for 数值的, 字母, 汉字 and 字节 mode
- 支持混合模式
- 支持中文、西里尔文、希腊文和日文字符
- 支持多字节字符(如表情符号:smile:)
- 自动生成优化的片段,以实现最佳数据压缩和最小的二维码大小
- 与应用程序无关的可读性,根据定义,QR 码与应用程序无关
Installation
在项目文件夹中执行以下作:
1 npm install --save qrcode
或者,全局安装以使用 qrcode from the command line to save qrcode images 或者 generate ones you can view in your terminal.
1 npm install -g qrcode
Usage
CLI
12345678910111213141516171819202122232425 Usage: qrcode [options] 二维码选项: -v, --qversion QR Code symbol version (1 - 40) [number] -e, --error Error correction level [choices: "L", "M", "Q", "H"] -m, --mask Mask pattern (0 - 7) [number] Renderer options: -t, --type Output type [choices: "png", "svg", "utf8"] -w, --width Image width (px) [number] -s, --scale Scale factor [number] -q, --qzone Quiet zone size [number] -l, --lightcolor Light RGBA hex color -d, --darkcolor Dark RGBA hex color --small Output smaller QR code to terminal [boolean] 选项: -o, --output Output file -h, --help Show help [boolean] --version Show version number [boolean] 例s: qrcode "some text" Draw in terminal window qrcode -o out.png "some text" Save as png image qrcode -d F00 -o out.png "some text" Use red as foreground color
如果 not specified, output type is guessed from file extension.
认可的扩展名是 png, svg and txt.
浏览器
node-qrcode 可以通过模块捆绑器在浏览器中使用,例如Browserify and Webpack 或者通过包含build/ 文件夹。
模块捆绑器
123456 <html> <body> <canvas id="canvas">canvas> <script src="bundle.js">script> body>html>
12345678 // index.js -> bundle.jsvar QRCode = require('qrcode')var canvas = document.getElementById('canvas') QRCode.toCanvas(canvas, 'sample text', function (error) { if (error) console.error(error) console.log('success!');})
预编译捆绑包
123456789 <canvas id="canvas">canvas> <script src="/build/qrcode.js">script><script> QRCode.toCanvas(document.getElementById('canvas'), 'sample text', function (error) { if (error) console.error(error) console.log('success!'); })script>
如果您通过 npm,预编译文件将在 node_modules/qrcode/build/ folder.
预编译的捆绑包支持 Internet Explorer 10+, Safari 5.1+,和 all evergreen browsers.
节点JS
需要模块 qrcode
12345 var QRCode = require('qrcode') QRCode.toDataURL('I am a pony!', function (err, url) { console.log(url)})
为终端渲染 QR 码
12345 var QRCode = require('qrcode') QRCode.toString('I am a pony!',{type:'terminal'}, function (err, url) { console.log(url)})
ES6/ES7
Promise 和 Async/Await 可用于代替回调函数。
12345678910111213141516171819 import QRCode from 'qrcode' // With promisesQRCode.toDataURL('I am a pony!') .then(url => { console.log(url) }) .catch(err => { console.error(err) }) // With async/awaitconst generateQR = async text => { try { console.log(await QRCode.toDataURL(text)) } catch (err) { console.error(err) }}
Error correction level
纠错功能允许成功扫描 QR 码,即使符号脏污或损坏。
根据作环境有四个级别可供选择。
较高的级别提供更好的抗错性,但会降低符号的容量。
如果二维码符号损坏的可能性很低(例如ample,如果它通过显示器显示)
可以安全地使用低误差级别,例如 Low or Medium.
可能的级别如下所示:
| 水平 | 抗错性 |
|---|---|
| L (低) | ~7% |
| M (中) | ~15% |
| Q (四分位数) | ~25% |
| H (高) | ~30% |
百分比表示符号变得不可读的最大损坏表面量。
错误级别可以通过 options.errorCorrectionLevel 财产。
如果未指定,则默认值为 M.
123 QRCode.toDataURL('some text', { errorCorrectionLevel: 'H' }, function (err, url) { console.log(url)})
QR Code capacity
容量取决于符号版本和纠错级别。此外,编码模式可能会影响可存储数据量。
QR 码版本范围从 1 到版本40.
每个版本都有不同数量的模块(黑点和白点),用于定义符号的大小。
对于版本 1,它们是 21x21,适用于版本 2 25x25 以此类推。
版本越高,可存储数据越多,当然二维码符号也会越大。
下表显示了每种编码模式和每个纠错级别的最大可存储字符数。
| Mode | L | M | Q | H |
|---|---|---|---|---|
| Numeric | 7089 | 5596 | 3993 | 3057 |
| Alphanumeric | 4296 | 3391 | 2420 | 1852 |
| Byte | 2953 | 2331 | 1663 | 1273 |
| Kanji | 1817 | 1435 | 1024 | 784 |
注意: 使用时最大字符数可以不同混合模式.
二维码版本可通过 options.version property.
如果未指定版本,则将使用更合适的值。除非需要特定版本,否则不需要此选项。
123 QRCode.toDataURL('some text', { version: 2 }, function (err, url) { console.log(url)})
编码模式
模式可用于以更有效的方式对字符串进行编码。
根据字符串内容,一种模式可能比其他模式更合适。
支持的模式列表如下表所示:
| Mode | 字符 | 压缩 |
|---|---|---|
| Numeric | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 | 3 个字符由 10 位表示 |
| Alphanumeric | 0–9、A–Z(仅限大写)、空格、$、%、*、+、-, ., /、: | 2 个字符由 11 位表示 |
| Kanji | 基于 JIS X 0208 的 Shift JIS 系统中的字符 | 2 个汉字由 13 位表示 |
| Byte | ISO/IEC 8859-1 字符集中的字符 | 每个字符由 8 位表示 |
如果输入文本未知,选择正确的模式可能会很棘手。
在这些情况下 Byte mode is the best choice since all characters can be encoded with it. (看见 Multibyte characters)
但是,如果二维码阅读器支持混合模式,则使用 自动模式 可能会产生更好的结果。
Mixed modes
混合模式也是可能的。可以从具有不同编码模式的一系列段生成二维码,以优化数据压缩。
但是,从一种模式切换到另一种模式是有代价的,如果不考虑这一点,可能会导致最糟糕的结果。
看 手动模式 有关如何指定具有不同编码模式的段的示例。
Auto mode
由 default,则使用自动模式选择。
输入字符串自动拆分为经过优化的各个段,以使用混合模式生成尽可能短的比特流。
这是生成二维码的首选方式。
例如,字符串 ABCDE12345678?答1A 将分为 3 个部分,具有以下模式:
| 段 | Mode |
|---|---|
| ABCDE | Alphanumeric |
| 12345678 | Numeric |
| ?A1A | Byte |
段和模式的任何其他组合都会导致更长的比特流。
如果您需要保持较小的 QR 码尺寸,此模式将产生最佳结果。
Manual mode
如果自动模式不适合您或您有特定需求,也可以使用相对模式手动指定每个段。
这样,不会在幕后应用任何细分优化。
Segments 列表可以作为对象数组传递:
12345678910 var QRCode = require('qrcode') var segs = [ { data: 'ABCDEFG', mode: 'alphanumeric' }, { data: '0123456', mode: 'numeric' }] QRCode.toDataURL(segs, function (err, url) { console.log(url)})
汉字模式
使用汉字模式,可以以优化的方式对 Shift JIS 系统中的字符进行编码。
不幸的是,没有办法从以 UTF-8 编码的字符计算移位 JIS 值,因此需要一个从输入字符到 SJIS 值的转换表。
默认情况下,此表不包含在捆绑包中,以保持尽可能小的大小。
如果您的应用程序需要汉字支持,您将需要传递一个函数,该函数将负责将输入字符转换为适当的值。
lib 通过一个可选文件提供了一个帮助程序方法,您可以包含该文件,如下面的示例所示。
Note: 仅当您想要从数据压缩中受益时才需要支持汉字模式,否则仍然可以使用字节模式对汉字进行编码(请参阅Multibyte characters).
123456 var QRCode = require('qrcode')var toSJIS = require('qrcode/helper/to-sjis') QRCode.toDataURL(kanjiString, { toSJISFunc: toSJIS }, function (err, url) { console.log(url)})
使用预编译的捆绑包:
1234567891011 <canvas id="canvas">canvas> <script src="/build/qrcode.min.js">script><script src="/build/qrcode.tosjis.min.js">script><script> QRCode.toCanvas(document.getElementById('canvas'), 'sample text', { toSJISFunc: QRCode.toSJIS }, function (error) { if (error) console.error(error) console.log('success!') })script>
Binary data
QR 码可以保存任意基于字节的二进制数据。如果您尝试通过首先将数据转换为 JavaScript 字符串来创建二进制 QR 码,它将无法对 propery 进行编码,因为字符串编**添加额外的字节。相反,您必须将 Uint8ClampedArray 或兼容数组,或节点Buffer如下:
123456789 // Regular array example// WARNING: Element values will be clamped to 0-255 even if your data contains higher values.const QRCode = require('qrcode')QRCode.toFile( 'foo.png', [{ data: [253,254,255], mode: 'byte' }], ...options..., ...callback...)
123456789 // Uint8ClampedArray exampleconst QRCode = require('qrcode') QRCode.toFile( 'foo.png', [{ data: new Uint8ClampedArray([253,254,255]), mode: 'byte' }], ...options..., ...callback...)
12345678910 // Node Buffer example// WARNING: Element values will be clamped to 0-255 even if your data contains higher values.const QRCode = require('qrcode') QRCode.toFile( 'foo.png', [{ data: Buffer.from([253,254,255]), mode: 'byte' }], ...options..., ...callback...)
TypeScript 用户:如果您正在使用 @types/qrcode,您需要添加一个 // @ts-ignore 高于数据段,因为它期望data: string.
Multibyte characters
初始 QR 码标准中不支持多字节字符,但可以在字节模式下对 UTF-8 字符进行编码。
QR 码提供了一种通过 ECI(扩展通道解释)指定不同类型字符集的方法,但尚未在此库中完全实现。
然而,即使没有 ECI,大多数 QR 码阅读器也能够识别多字节字符。
请注意,单个汉字/假名或表情符号最多可以占用 4 个字节。
API
浏览器:
服务器:
浏览器 API
create(text, [options])
创建 QR 码符号并返回 qrcode 对象。
text
类型: String|Array
要编码的文本或描述段的对象列表。
options
See QR Code options.
returns
Type: Object
12345678 // QRCode object{ modules, // Bitmatrix class with modules data version, // Calculated QR Code version errorCorrectionLevel, // Error Correction Level maskPattern, // Calculated Mask pattern segments // Generated segments}
toCanvas(canvasElement, text, [options], [cb(error)])
toCanvas(text, [options], [cb(error, canvas)])
绘制二维码符号 canvas.
If canvasElement 省略返回新画布。
canvasElement
Type: DOMElement
画布在哪里绘制二维码。
text
Type: String|Array
Text to encode or a list of objects describing segments.
options
See Options.
cb
Type: Function
完成时调用的回调函数。
Example
123456 QRCode.toCanvas('text', { errorCorrectionLevel: 'H' }, function (err, canvas) { if (err) throw err var container = document.getElementById('container') container.appendChild(canvas)})
toDataURL(text, [options], [cb(error, url)])
toDataURL(canvasElement, text, [options], [cb(error, url)])
返回包含 QR 码图像表示形式的数据 URI。
如果提供, canvasElement 将用作画布来生成数据 URI。
canvasElement
Type: DOMElement
Canvas where to draw QR Code.
text
Type: String|Array
Text to encode or a list of objects describing segments.
options
-
typeType:
String
Default:image/png数据 URI 格式。
Possible values are:image/png,image/jpeg,image/webp. -
rendererOpts.qualityType:
Number
Default:0.92之间的数字
0and1如果请求的类型为image/jpegorimage/webp.
See Options 用于其他设置。
cb
Type: Function
Callback function called on finish.
Example
1234567891011121314151617 var opts = { errorCorrectionLevel: 'H', type: 'image/jpeg', quality: 0.3, margin: 1, color: { dark:"#010599FF", light:"#FFBF60FF" }} QRCode.toDataURL('text', opts, function (err, url) { if (err) throw err var img = document.getElementById('image') img.src = url})
toString(text, [options], [cb(error, string)])
返回 QR 码的字符串表示形式。
text
Type: String|Array
Text to encode or a list of objects describing segments.
options
-
typeType:
String
Default:utf8输出格式。
Possible values are:terminal,utf8, andsvg.
See Options for other settings.
cb
Type: Function
Callback function called on finish.
Example
1234 if (err) throw err console.log(string)})
服务器 API
create(text, [options])
See create.
toCanvas(canvas, text, [options], [cb(error)])
Draws qr code symbol to node canvas.
text
Type: String|Array
Text to encode or a list of objects describing segments.
options
See Options.
cb
Type: Function
Callback function called on finish.
toDataURL(text, [options], [cb(error, url)])
Returns a Data URI containing a representation of the QR Code image.
仅适用于 image/png 键入。
text
Type: String|Array
Text to encode or a list of objects describing segments.
options
See Options for other settings.
cb
Type: Function
Callback function called on finish.
toString(text, [options], [cb(error, string)])
Returns a string representation of the QR Code.
如果选择的输出格式为 svg 它将返回一个包含 XML 代码的字符串。
text
Type: String|Array
Text to encode or a list of objects describing segments.
options
-
typeType:
String
Default:utf8Output format.
Possible values are:utf8,svg,terminal.
See Options for other settings.
cb
Type: Function
Callback function called on finish.
Example
1234 if (err) throw err console.log(string)})
toFile(path, text, [options], [cb(error)])
将 QR 码保存到图像文件。
If options.type 未指定,则格式将从文件扩展名中猜测。
Recognized extensions are png, svg, txt.
path
Type: String
保存文件的路径。
text
Type: String|Array
Text to encode or a list of objects describing segments.
options
-
typeType:
String
Default:pngOutput format.
Possible values are:png,svg,utf8. -
rendererOpts.deflateLevel(仅限 png)Type:
Number
Default:9放气的压缩水平。
-
rendererOpts.deflateStrategy(png only)Type:
Number
Default:3放气的压缩策略。
See Options for other settings.
cb
Type: Function
Callback function called on finish.
Example
123456789 QRCode.toFile('path/to/filename.png', 'Some text', { color: { dark: '#00F', // Blue dots light: '#0000' // Transparent background }}, function (err) { if (err) throw err console.log('done')})
toFileStream(stream, text, [options])
将 QR 码图像写入流媒体。仅适用于 png 格式。
stream
Type: stream.Writable
节点流。
text
Type: String|Array
Text to encode or a list of objects describing segments.
options
See Options.
Options
QR Code options
version
Type: Number
二维码版本。如果未指定,将计算更合适的值。
errorCorrectionLevel
Type: String
Default: M
纠错级别。
Possible values are low, medium, quartile, high or L, M, Q, H.
maskPattern
Type: Number
用于遮罩符号的遮罩图案。
Possible values are 0, 1, 2, 3, 4, 5, 6, 7.
If not specified the more suitable value will be calculated.
toSJISFunc
Type: Function
内部用于将汉字转换为其 Shift JIS 值的辅助函数。
Provide this function if you need support for Kanji mode.
渲染器选项
margin
Type: Number
Default: 4
定义安静区应该有多宽。
scale
Type: Number
Default: 4
比例因子。值 1 表示每个模块 1px(黑点)。
small
Type: Boolean
Default: false
仅与终端渲染器相关。输出较小的二维码。
width
Type: Number
强制输出图像的特定宽度。
If width is too small to contain the qr symbol, this option will be ignored.
Takes precedence over scale.
color.dark
Type: String
违约: #000000ff
深色模块的颜色。值必须为十六进制格式 (RGBA)。
注意:深色应始终深于 color.light.
color.light
Type: String
Default: #ffffffff
灯模块的颜色。值必须为十六进制格式 (RGBA)。
GS1 QR Codes
这里有关于它们的非常好的讨论。但简而言之,任何 QR 码生成器都会制作与 GS1 兼容的 QRCODE,但定义 GS1 QRCode 的是一个带有描述 GS1 信息的元数据的标头。
https://github.com/soldair/node-qrcode/issues/45
Credits
该库基于“QRCode for JavaScript”,幸运的是 Kazuhiko Arase 获得了麻省理工学院的许可。
License
“QR Code”一词是以下公司的注册商标:
电装波浪公司
免责声明 © 2025 - 虚宝阁
本站部分源码来源于网络,版权归属原开发者,用户仅获得使用权。依据《计算机软件保护条例》第十六条,禁止:
- 逆向工程破解技术保护措施
- 未经许可的分发行为
- 去除源码中的原始版权标识
※ 本站源码仅用于学习和研究,禁止用于商业用途。如有侵权, 请及时联系我们进行处理。