QR Code Guide: How to Create, Customize & Use QR Codes
· 10 min read
什么是二维码及其工作原理
二维码(QR Code,Quick Response Code)是一种二维矩阵条码,由日本电装公司(Denso Wave)于1994年发明。最初用于汽车制造业的零件追踪,如今已成为连接物理世界与数字世界的重要桥梁。与传统的一维条形码相比,二维码能够存储更多信息,并且可以从任何角度快速读取。
二维码的基本结构
一个标准的二维码由以下关键元素组成:
- 定位图案(Position Detection Patterns): 位于二维码三个角落的大型方块,帮助扫描设备确定二维码的方向和位置
- 对齐图案(Alignment Patterns): 在较大的二维码中出现,用于校正图像扭曲
- 时序图案(Timing Patterns): 在定位图案之间的交替黑白模块,帮助确定数据模块的坐标
- 格式信息(Format Information): 包含错误纠正级别和掩码模式的信息
- 版本信息(Version Information): 在版本7及以上的二维码中出现,标识二维码的版本
- 数据和纠错码字(Data and Error Correction Codewords): 实际编码的信息和用于错误恢复的冗余数据
- 静区(Quiet Zone): 二维码周围的空白边界,确保扫描设备能够正确识别
数据编码方式
二维码支持多种编码模式,根据数据类型自动选择最优编码方式:
- 数字模式(Numeric): 仅包含数字0-9,每3位数字编码为10位二进制,存储效率最高,最多可存储7,089个字符
- 字母数字模式(Alphanumeric): 包含数字、大写字母和部分符号(空格、$、%、*、+、-、.、/、:),每2个字符编码为11位二进制,最多可存储4,296个字符
- 字节模式(Byte): 可以编码任何8位字节数据,包括中文、日文等多字节字符,最多可存储2,953个字节
- 汉字模式(Kanji): 专门为日文汉字优化,每个字符编码为13位二进制,最多可存储1,817个汉字
错误纠正级别
二维码采用Reed-Solomon纠错算法,即使部分损坏也能正常读取。共有四个错误纠正级别:
| 级别 | 恢复能力 | 数据容量损失 | 适用场景 |
|---|---|---|---|
| L (Low) | 约7% | 最小 | 清洁环境,短期使用,需要最大数据容量 |
| M (Medium) | 约15% | 中等 | 一般应用,平衡容量与可靠性 |
| Q (Quartile) | 约25% | 较高 | 工业环境,可能有污损或磨损 |
| H (High) | 约30% | 最高 | 恶劣环境,需要嵌入logo,长期户外使用 |
选择错误纠正级别时需要权衡:更高的纠错级别意味着更强的容错能力,但也会减少可存储的数据量,并增加二维码的复杂度。对于需要在中心嵌入logo的二维码,建议使用Q或H级别。
扫描与解码过程
当扫描设备读取二维码时,会经历以下步骤:
- 图像捕获: 相机或扫描器捕获二维码图像
- 定位: 识别三个定位图案,确定二维码的位置、大小和旋转角度
- 透视校正: 将倾斜或扭曲的图像转换为正面视图
- 采样: 将图像转换为黑白模块矩阵
- 解码: 读取格式信息,确定版本和纠错级别
- 数据提取: 按照特定的读取顺序提取数据码字
- 错误纠正: 使用Reed-Solomon算法纠正错误
- 数据解析: 根据编码模式将二进制数据转换为原始信息
二维码的类型
根据存储的数据类型和用途,二维码可以分为多种类型。每种类型都遵循特定的数据格式标准,使扫描设备能够自动执行相应的操作。
URL二维码
这是最常见的二维码类型,存储网址链接。扫描后自动在浏览器中打开网页。
格式: https://example.com/page
用途: 网站推广、产品信息、在线菜单、活动注册
实际应用示例:餐厅将菜单URL编码为二维码,顾客扫描后直接查看电子菜单,无需接触纸质菜单,既卫生又环保。
vCard二维码
存储联系人信息,扫描后可直接保存到手机通讯录。支持姓名、电话、邮箱、地址、公司等多个字段。
格式示例:
BEGIN:VCARD
VERSION:3.0
FN:张三
TEL:+86-138-0000-0000
EMAIL:[email protected]
ORG:科技公司
URL:https://example.com
END:VCARD
商务场景中,将vCard二维码印在名片上,对方扫描即可保存完整联系信息,避免手动输入错误。
WiFi二维码
存储WiFi网络的SSID、密码和加密类型,扫描后自动连接网络,无需手动输入密码。
格式: WIFI:T:WPA;S:网络名称;P:密码;H:false;;
参数说明:
T - 加密类型(WPA/WEP/nopass)
S - 网络SSID
P - 密码
H - 是否隐藏网络(true/false)
咖啡馆、酒店等场所可以在显眼位置放置WiFi二维码,顾客扫描即可连接,提升用户体验。
电子邮件二维码
扫描后自动打开邮件客户端,预填收件人、主题和正文。
格式: mailto:[email protected]?subject=咨询&body=您好,我想了解...
参数:
- 收件人地址
- subject: 邮件主题
- body: 邮件正文
- cc: 抄送
- bcc: 密送
短信二维码
扫描后打开短信应用,预填收件人和消息内容。
格式:
SMS:+86-138-0000-0000:预设消息内容
或
SMSTO:+86-138-0000-0000:预设消息内容
营销活动中,可以让用户扫描二维码发送特定关键词参与抽奖或获取优惠。
地理位置二维码
存储经纬度坐标,扫描后在地图应用中显示位置或启动导航。
格式: geo:39.9042,116.4074
或带查询参数: geo:39.9042,116.4074?q=天安门广场
活动邀请函上印制地理位置二维码,参与者扫描后直接导航到活动地点。
支付二维码
用于移动支付,包含商户信息和交易金额。不同支付平台有各自的编码标准。
示例(简化):
- 微信支付: weixin://wxpay/bizpayurl?...
- 支付宝: https://qr.alipay.com/...
- 银联: upi://pay?...
应用下载二维码
链接到应用商店的下载页面,或使用深度链接直接打开已安装的应用。
iOS: https://apps.apple.com/app/id123456789
Android: https://play.google.com/store/apps/details?id=com.example.app
深度链接: myapp://open?page=home
如何创建二维码
创建二维码有多种方法,从在线工具到编程库,可以根据需求选择合适的方式。
方法一:使用在线生成器
这是最简单快捷的方式,适合个人用户和小批量需求。
- 选择可靠的在线工具: 如QR Code Generator、QRCode Monkey、Unitag等
- 选择二维码类型: URL、文本、vCard、WiFi等
- 输入数据: 根据选择的类型填写相应信息
- 设置参数:
- 选择错误纠正级别(L/M/Q/H)
- 调整尺寸(像素或厘米)
- 选择输出格式(PNG、SVG、EPS等)
- 定制外观(可选): 修改颜色、添加logo、改变样式
- 生成并下载: 预览效果后下载文件
- 测试: 使用多个设备和应用扫描测试
方法二:使用编程库
适合需要批量生成或集成到应用中的开发者。
Python示例(使用qrcode库):
import qrcode
# 基础生成
qr = qrcode.QRCode(
version=1, # 1-40,控制二维码大小
error_correction=qrcode.constants.ERROR_CORRECT_H,
box_size=10, # 每个模块的像素大小
border=4, # 边框宽度(模块数)
)
qr.add_data('https://example.com')
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
img.save('qrcode.png')
# 带logo的二维码
from PIL import Image
qr = qrcode.QRCode(error_correction=qrcode.constants.ERROR_CORRECT_H)
qr.add_data('https://example.com')
qr.make()
img = qr.make_image(fill_color="#1a73e8", back_color="white").convert('RGB')
# 添加logo
logo = Image.open('logo.png')
logo_size = img.size[0] // 4
logo = logo.resize((logo_size, logo_size))
logo_pos = ((img.size[0] - logo_size) // 2, (img.size[1] - logo_size) // 2)
img.paste(logo, logo_pos)
img.save('qrcode_with_logo.png')
JavaScript示例(使用qrcode.js):
// Node.js环境
const QRCode = require('qrcode');
// 生成为文件
QRCode.toFile('qrcode.png', 'https://example.com', {
errorCorrectionLevel: 'H',
type: 'png',
width: 300,
color: {
dark: '#000000',
light: '#FFFFFF'
}
}, function (err) {
if (err) throw err;
console.log('二维码已生成');
});
// 生成为Data URL(浏览器环境)
QRCode.toDataURL('https://example.com', {
errorCorrectionLevel: 'M',
width: 300
}, function (err, url) {
if (err) throw err;
document.getElementById('qrcode').src = url;
});
Java示例(使用ZXing库):
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
public class QRCodeGenerator {
public static void generateQRCode(String data, String path)
throws WriterException, IOException {
Map hints = new HashMap<>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
hints.put(EncodeHintType.MARGIN, 1);
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix bitMatrix = qrCodeWriter.encode(
data,
BarcodeFormat.QR_CODE,
300,
300,
hints
);
Path filePath = FileSystems.getDefault().getPath(path);
MatrixToImageWriter.writeToPath(bitMatrix, "PNG", filePath);
}
}
方法三:使用命令行工具
适合需要在脚本中批量生成的场景。
# 使用qrencode(Linux/Mac)
qrencode -o qrcode.png -s 10 -l H "https://example.com"
# 参数说明:
# -o: 输出文件名
# -s: 模块大小(像素)
# -l: 错误纠正级别(L/M/Q/H)
# -m: 边距宽度
# 批量生成
while IFS=, read -r name url; do
qrencode -o "qr_${name}.png" -s 10 -l H "$url"
done < urls.csv
最佳实践建议
- 数据优化: 尽量缩短URL,使用短链接服务减少数据量
- 版本选择: 让库自动选择版本(fit=True),确保数据完整存储
- 测试验证: 生成后务必用多个设备和应用测试扫描
- 格式选择: 印刷用SVG或EPS矢量格式,数字媒体用PNG
- 备份保存: 保存原始数据和生成参数,便于后续修改
二维码定制化
虽然标准的黑白二维码功能完善,但定制化设计可以提升品牌识别度和视觉吸引力。不过,过度定制可能影响扫描性能,需要谨慎平衡。
颜色定制
二维码不必是黑白的,可以使用品牌色彩,但需遵循以下原则:
- 对比度要求: 前景色和背景色之间必须有足够的对比度,建议对比度比至少为4:1
- 深色前景: 数据模块(通常是黑色部分)应使用深色
- 浅色背景: 背景应使用浅色或白色
- 避免渐变: 不要在数据区域使用渐变色,会影响扫描
- 测试验证: 更改颜色后必须在不同光线条件下测试
推荐的颜色组合:
✓ 深蓝(#1a73e8) + 白色
✓ 深绿(#0f9d58) + 白色
✓ 深紫(#673ab7) + 白色
✓ 黑色 + 浅黄(#fff9c4)
✗ 红色 + 绿色(色盲用户难以区分)
✗ 黄色 + 白色(对比度不足)
✗ 浅灰 + 白色(对比度不足)
嵌入Logo
在二维码中心嵌入品牌logo是常见的定制方式,但需要注意:
- 错误纠正级别: 必须使用Q(25%)或H(30%)级别
- Logo大小: 不应超过二维码面积的20-30%
- Logo位置: 通常放在中心,避免覆盖定位图案
- Logo边框: 在logo周围添加白色边框,提高识别率
- Logo形状: 圆形或圆角矩形比尖锐边角更安全
实现步骤:
- 生成错误纠正级别为H的二维码
- 准备高清logo图片(PNG格式,透明背景)
- 将logo缩放到二维码尺寸的15-20%
- 在logo周围添加白色边框(约logo宽度的5-10%)
- 将logo居中叠加到二维码上
- 测试扫描性能
形状定制
可以修改二维码模块的形状,创造独特的视觉效果:
- 圆点: 将方形模块替换为圆点,更柔和友好
- 圆角方块: 保持方形但添加圆角
- 自定义图案: 使用品牌相关的小图标替代标准模块
- 定位图案定制: 修改三个角落的定位图案样式
注意事项:
- 形状变化不应过于剧烈,保持模块之间的清晰边界
- 定位图案的修改要谨慎,确保扫描器仍能识别
- 复杂的形状可能降低扫描速度和成功率
- 务必在多种设备上测试
背景图案
可以在二维码背景添加图案或图片,但这是最具挑战性的定制:
- 背景图案必须非常浅淡,不能干扰数据模块
- 使用高错误纠正级别(H)
- 确保数据模块与背景有明显对比
- 可以在静区(边框)添加装饰性元素
- 避免在数据区域使用复杂图案
框架和装饰
在二维码周围添加框架、文字说明或行动号召:
示例布局:
┌─────────────────────┐
│ 扫描查看菜单 │
│ ┌─────────────┐ │
│ │ │ │
│ │ [QR CODE] │ │
│ │ │ │
│ └─────────────┘ │
│ 使用微信或相机扫描 │
└─────────────────────┘
- 添加简短的行动号召文字(如"扫描了解更多")
- 说明支持的扫描方式
- 使用品牌色彩的边框
- 确保框架不侵入静区
定制工具推荐
- 在线工具: QRCode Monkey、Unitag、Visualead(支持高级定制)
- 设计软件: Adobe Illustrator + 插件、Figma + 插件
- 编程库: qrcode-styled(JavaScript)、qrcode-artistic(Python)
二维码尺寸与扫描距离指南
二维码的尺寸直接影响扫描距离和成功率。选择合适的尺寸需要考虑使用场景、扫描距离和印刷质量。
基本尺寸公式
二维码尺寸与扫描距离的关系可以用以下公式估算:
二维码尺寸 = 扫描距离 ÷ 10
示例:
- 扫描距离20cm → 二维码尺寸至少2cm × 2cm
- 扫描距离1米 → 二维码尺寸至少10cm × 10cm
- 扫描距离5米 → 二维码尺寸至少50cm × 50cm
这是保守估算,实际效果受多种因素影响。
不同场景的尺寸建议
| 应用场景 | 扫描距离 | 推荐尺寸 | 最小尺寸 |
|---|---|---|---|
| 名片 | 10-20cm | 2cm × 2cm | 1.5cm × 1.5cm |
| 产品包装 | 20-30cm | 2.5cm × 2.5cm | 2cm × 2cm |
| 餐桌台卡 | 30-50cm | 4cm × 4cm | 3cm × 3cm |
| A4传单 | 30-40cm | 4cm × 4cm | 3cm × 3cm |
| 海报 | 50cm-1m | 8cm × 8cm | 5cm × 5cm |
| 店铺橱窗 | 1-2米 | 15cm × 15cm | 10cm × 10cm |
| 户外广告牌 | 3-5米 | 40cm × 40cm | 30cm × 30cm |
| 建筑物外墙 | 10米以上 | 1m × 1m以上 | 80cm × 80cm |
影响扫描距离的因素
- 数据量: 存储的数据越多,二维码越复杂,需要更大尺寸或更近距离
- 错误纠正级别: 更高级别增加复杂度,可能需要更大尺寸
- 对比度: 高对比度可以在更远距离扫描
- 光线条件: 充足均匀的
Frequently Asked Questions
How do I create a QR code for free?
Use a free online QR code generator like GenKit. Enter your URL or data, customize colors if desired, and download the QR code as PNG or SVG. No account required.
What is the difference between static and dynamic QR codes?
Static QR codes encode data directly and cannot be changed after creation. Dynamic QR codes use a redirect URL that can be updated anytime, and they support scan tracking and analytics.
How small can a QR code be and still work?
The minimum recommended size is 2x2 cm (0.8x0.8 inches) for close-range scanning. For posters or billboards, use the rule: scanning distance divided by 10 equals minimum QR code size.
Are QR codes safe to scan?
QR codes themselves are safe, but they can link to malicious websites. Always check the URL preview before opening. Avoid scanning QR codes from untrusted sources or those placed over existing codes.
Can I put a logo in the middle of a QR code?
Yes, if you use high error correction (level H, 30% redundancy). The logo should cover no more than 20-25% of the QR code area to ensure reliable scanning.
Related Tools