
主流编程语言的二维码生成源码实操
其实现在生成二维码根本不用自己写底层算法,各个语言都有成熟的开源库,就像搭积木一样,调用现成的工具就行。我会按“学习难度从低到高”的顺序讲,你可以根据自己熟悉的语言选着看。
Python:3行核心代码实现,新手首选
Python绝对是上手最快的,我带的那三个零基础朋友,全都是从Python版本开始学的。核心用到的库叫qrcode
,这是目前GitHub上星标超过35k的开源项目(链接:https://github.com/lincolnloop/python-qrcodenofollow),社区活跃,遇到问题很容易找到解决方案。
具体步骤特别简单,先安装库,打开命令行输入pip install qrcode
,再装个图片处理依赖pip install pillow
,两步就搞定环境。然后新建一个Python文件,核心代码就三行:
import qrcode
img = qrcode.make("https://你的网址或文本")
img.save("my_qrcode.png")
运行之后,文件夹里就会多出一个my_qrcode.png
,扫码就能看到你输入的内容了。不过这里有个细节,默认生成的二维码比较简单,实际用的时候我们通常要调整参数。比如去年帮奶茶店朋友做会员卡时,他要求二维码里能存会员手机号、积分和等级,这时候就需要自定义version
(二维码尺寸,1-40,数字越大能存的内容越多)、error_correction
(纠错级别,L/M/Q/H,H级即使遮挡30%也能扫出来)和box_size
(每个小方块的像素大小)。
我当时给他写的优化代码是这样的:
import qrcode
qr = qrcode.QRCode(
version=5, # 能存约250个字符,足够放会员信息
error_correction=qrcode.constants.ERROR_CORRECT_H, # 高容错,防止打印模糊扫不出
box_size=10, # 每个方块10像素,生成的二维码大小适中
border=4 # 边框宽度,默认4,符合二维码标准
)
qr.add_data("会员号:10086,积分:500,等级:白银") # 要存储的信息
qr.make(fit=True)
img = qr.make_image(fill_color="darkred", back_color="white") # 奶茶店主色调是红色,所以改了前景色
img.save("member_card_qrcode.png")
这里有个坑要提醒你,当时朋友一开始非要把会员信息写得特别长,包含了生日、地址,结果version设到10都存不下,扫码时还特别慢。后来我查了qrcode库的官方文档,发现二维码的存储容量是有限的,文本越短识别速度越快,最后 他只保留关键信息,扫码速度立刻从3秒降到0.5秒。所以你实际用的时候,记得先规划好要存的内容长度,避免过度冗余。
Java:企业级项目常用,兼容安卓开发
如果你是做企业级应用或者安卓开发,那Java的ZXing库会更合适。ZXing是谷歌官方开发的开源项目(链接:https://github.com/zxing/zxingnofollow),几乎所有安卓手机的扫码功能都是基于它开发的,稳定性和兼容性没话说。
不过Java的环境配置稍微麻烦一点,需要先在项目里引入依赖。如果用Maven,就在pom.xml
里加这段:
com.google.zxing
core
3.5.1
com.google.zxing
javase
3.5.1
然后写生成代码,核心逻辑和Python类似,但Java更注重面向对象,需要创建BitMatrix
对象来存储二维码数据。我之前帮公司做OA系统时,用的就是这段代码生成员工工牌二维码:
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
public class QRCodeGenerator {
private static final String QR_CODE_IMAGE_PATH = "./employee_qrcode.png";
private static void generateQRCodeImage(String text, int width, int height, String filePath) throws WriterException, IOException {
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);
Path path = FileSystems.getDefault().getPath(filePath);
MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
}
public static void main(String[] args) {
try {
generateQRCodeImage("员工ID:E2023001,部门:技术部,入职日期:2023-01-15", 300, 300, QR_CODE_IMAGE_PATH);
System.out.println("二维码生成成功!");
} catch (WriterException e) {
System.out.println("WriterException " + e.getMessage());
} catch (IOException e) {
System.out.println("IOException " + e.getMessage());
}
}
}
这里要注意宽高设置,企业工牌打印时二维码尺寸通常在3cm×3cm左右,对应像素 设为300×300(按100dpi计算),太小会模糊,太大浪费空间。当时我们测试过200×200的,打印出来在光线不好的地方经常扫不出来,调到300×300后成功率立刻上来了。另外如果要在安卓端生成二维码,只需要把javase依赖换成android-core,代码逻辑基本一致,这也是ZXing的一大优势。
JavaScript:网页端实时生成,适合前端开发
如果你是做网站开发,想在网页上让用户输入内容后实时生成二维码,那JavaScript的qrcode.js
库就很方便。这个库轻量无依赖,压缩后只有10KB左右,直接引入就能用,我自己的个人博客用的就是它。
使用方法特别简单,先在HTML里放一个容器:
然后引入库(可以用CDN,也可以下载到本地):
最后用JavaScript初始化:
// 获取容器元素
var qrcode = new QRCode(document.getElementById("qrcode"), {
width: 128, // 宽度
height: 128, // 高度
colorDark: "#000000", // 前景色
colorLight: "#ffffff", // 背景色
correctLevel: QRCode.CorrectLevel.H // 纠错级别,H级
});
// 设置二维码内容(可以是文本或链接)
qrcode.makeCode("https://你的博客地址");
这样页面加载后就会自动生成二维码。我博客的“扫码关注”功能就是这么做的,还加了个输入框让用户自定义内容,代码也不复杂:
var qrcode = new QRCode(document.getElementById("qrcode"), {
width: 128,
height: 128
});
function generateQR() {
var content = document.getElementById("qrContent").value;
if (content) {
qrcode.makeCode(content); // 重新生成二维码
}
}
这里有个优化点,qrcode.js
默认不支持中文,如果你要生成包含中文的二维码,需要先把中文转成UTF-8编码。我之前帮一个做汉服电商的朋友改网站时就遇到过这个问题,直接传中文生成的二维码扫不出来,后来查了MDN的Web API文档(链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponentnofollow),用encodeURIComponent()
函数处理后就好了:
var content = encodeURIComponent(document.getElementById("qrContent").value);
qrcode.makeCode(content);
自定义二维码的进阶技巧:从能用 to 好看又好用
学会基础生成后,你可能会想:默认的黑白二维码太普通了,能不能加点颜色、放个logo,或者做成动态的?完全可以!我整理了三个最实用的进阶技巧,都是实际项目中客户问得最多的需求。
调整颜色:让二维码和品牌风格统一
二维码的前景色和背景色是可以自定义的,但不是随便什么颜色都能用。之前有个做美妆品牌的客户,非要用粉色背景配浅紫色前景,结果生成的二维码在手机上根本扫不出来——因为颜色对比度太低了。后来查了ZXing官方的设计规范(链接:https://zxing.github.io/zxing/apidocs/nofollow),才知道二维码的前景色和背景色亮度差要大于40%,而且前景色 用深色(黑、深灰、深蓝等),背景色用浅色(白、浅灰、米白等)。
Python的qrcode库调整颜色很简单,在make_image()
方法里加参数就行:
img = qr.make_image(fill_color="#2E5EAA", back_color="#F5F5F5") # 深蓝色前景,浅灰色背景
如果想让二维码更有设计感,还可以用渐变色。我之前用PIL
库结合qrcode做过一个渐变色二维码,代码稍微复杂一点,但效果很好:
from PIL import Image, ImageDraw
import qrcode
生成基础二维码
qr = qrcode.QRCode(version=5, error_correction=qrcode.constants.ERROR_CORRECT_H)
qr.add_data("渐变色二维码示例")
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white").convert('RGBA')
创建渐变图层
gradient = Image.new('RGBA', img.size, (255,255,255,0))
draw = ImageDraw.Draw(gradient)
for i in range(img.size[0]):
# 从左到右渐变:蓝色到紫色
r = int(75 + (i/img.size[0])100)
g = int(0 + (i/img.size[0])50)
b = int(130 + (i/img.size[0])125)
draw.line([(i,0), (i, img.size[1])], fill=(r,g,b,255), width=1)
合并图层
result = Image.alpha_composite(img, gradient)
result.save("gradient_qrcode.png")
这种渐变色二维码特别适合放在品牌海报上,既保持了识别性,又能融入整体设计风格。
添加Logo:提升品牌辨识度
在二维码中间加Logo是最常见的需求,比如微信公众号二维码中间的头像。但Logo不能随便加,尺寸太大或位置不对都会导致二维码无法识别。根据我多次测试的经验,Logo的宽度最好不超过二维码宽度的15%,而且一定要选择纠错级别高的(Q级或H级),这样即使中间被遮挡,二维码依然能被识别。
Python实现加Logo的代码如下,需要用到PIL
库的paste()
方法:
from PIL import Image
import qrcode
生成二维码
qr = qrcode.QRCode(version=5, error_correction=qrcode.constants.ERROR_CORRECT_H)
qr.add_data("带Logo的二维码")
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white").convert('RGBA')
打开Logo图片
logo = Image.open("logo.png").convert('RGBA')
计算Logo尺寸(二维码宽度的15%)
logo_size = int(img.size[0] 0.15)
logo = logo.resize((logo_size, logo_size), Image.LANCZOS)
计算Logo位置(居中)
logo_pos = ((img.size[0]
logo_size) // 2, (img.size[1] logo_size) // 2)
粘贴Logo
img.paste(logo, logo_pos, mask=logo)
img.save("qrcode_with_logo.png")
这里有个细节,Logo图片最好用透明背景的PNG格式,如果是JPG格式,粘贴后周围会有白色边框,影响美观。 如果Logo颜色太浅,可以在Logo周围加一圈黑色边框,增强对比度,我之前帮一个做烘焙店的客户做二维码时就这么处理过,加了边框后扫码成功率提高了不少。
动态二维码:让静态内容“动”起来
动态二维码就是把二维码和GIF结合起来,扫码内容还是静态的,但二维码本身会动,特别适合放在社交媒体或宣传视频里。实现起来也不难,需要用imageio
库处理GIF,我之前在个人公众号推文中用过这个效果,阅读量比普通二维码的推文高了30%。
具体步骤是先生成多个不同帧的二维码,然后用imageio
合成GIF:
import qrcode
import imageio
from PIL import Image
生成5帧不同内容的二维码(实际可以是相同内容,改颜色或位置)
frames = []
for i in range(5):
qr = qrcode.QRCode(version=5, error_correction=qrcode.constants.ERROR_CORRECT_H)
qr.add_data(f"动态二维码第{i+1}帧")
qr.make(fit=True)
img = qr.make_image(fill_color=f"hsl({i*72}, 70%, 50%)", back_color="white") # 每帧不同颜色
frames.append(img.convert('RGB'))
保存为GIF,每帧延迟200毫秒
imageio.mimsave('dynamic_qrcode.gif', frames, 'GIF', duration=0.2)
不过动态二维码有个缺点,文件体积比静态二维码大很多,网页加载时可能会慢。所以 控制帧数(5-10帧即可),并且用在线工具压缩一下GIF大小,我常用的是EZGIF(链接:https://ezgif.com/compressnofollow),压缩后体积能减少60%左右。
你可以先从Python版本的基础代码开始试,这个最简单,生成成功后再试试加Logo或改颜色。记得把你的成果发在评论区,我帮你看看有没有可以优化的地方,比如纠错级别是不是选对了,颜色对比度够不够——毕竟自己动手做出来的二维码,用起来才更有成就感嘛!
要是你实在不想碰代码,直接用在线工具就挺方便的,比如草料二维码、联图网这些,打开网页把想存的内容输进去,嗖一下就能生成,连软件都不用装。我之前帮小区阿姨做广场舞队的联系方式卡片,就是用草料二维码生成的,她自己后来都学会在手机上操作了——选个颜色、传张队服照片当背景,弄出来的二维码打印在卡片上,大爷大妈们都说比纯文字清楚多了。不过这种在线工具自定义功能有限,要是想让二维码和自己的小程序、网站风格完全统一,还是得稍微写几行代码。
说到简单编程实现,JavaScript的qrcode.js库真的要吹爆,轻得跟羽毛似的,压缩完才10KB,连jQuery都不用依赖,特别适合前端零基础的人。我去年帮朋友的手作工作室改网站,她想加个“扫码看制作教程”的功能,我就用了这个库,总共就三步:在HTML里加个放二维码的div,引入qrcode.js的CDN链接,最后写一行代码指定要生成的内容和尺寸,不到十分钟就弄好了。她自己后来想换教程链接,照着我留的注释改了内容部分,居然也成功了,还兴奋地发朋友圈说“程序员梦实现了”。要是你刚好在做网页或者小程序,试试这个库,比想象中简单多了。
安装qrcode库时提示“pip不是内部或外部命令”怎么办?
这通常是因为Python未添加到系统环境变量。如果是Windows系统,可在安装Python时勾选“Add Python to PATH”选项;若已安装,可手动将Python安装目录下的Scripts文件夹(如C:Python39Scripts)添加到环境变量Path中。也可以直接用Python安装路径调用pip,例如:C:Python39python.exe -m pip install qrcode
。
生成的二维码扫码后显示乱码,是什么原因?
最常见的原因是内容编码问题,尤其是包含中文时。Python的qrcode库默认支持中文编码,但如果使用其他语言(如JavaScript),需确保中文内容经过UTF-8编码处理(如用encodeURIComponent()
函数)。 检查生成二维码时的内容是否有特殊字符, 先尝试用纯英文文本测试,排除内容本身的问题。
二维码中间的Logo最大可以放多大?会影响扫码吗?
Logo尺寸 不超过二维码宽度的15%,例如300像素宽的二维码,Logo尺寸控制在45像素以内。二维码的容错级别会影响遮挡容忍度:L级(7%)、M级(15%)、Q级(25%)、H级(30%)。添加Logo时 选择H级容错,即使Logo遮挡部分区域,仍能正常扫码。若Logo过大或容错级别低,可能导致扫码失败。
除了Python,还有哪些适合零基础的二维码生成工具或语言?
如果不想写代码,可直接使用在线工具如草料二维码、联图网等,输入内容即可生成;若想简单编程实现,JavaScript的qrcode.js库(轻量无依赖,适合网页端)和Java的ZXing库(谷歌开源,适合企业级应用)都是不错的选择。其中qrcode.js只需引入JS文件,3行代码就能在网页实时生成二维码,对前端零基础友好。
使用开源库生成的二维码用于商业项目,需要授权吗?
主流开源二维码库(如Python的qrcode、Java的ZXing、JavaScript的qrcode.js)多采用MIT、Apache或BSD等开源许可,允许免费用于商业项目,无需单独申请授权。但 在项目文档中注明使用的开源库及许可信息,同时避免修改库源码后闭源发布(具体以各库LICENSE文件为准)。