文章目录▼CloseOpen
- 用Python做带图二维码:从安装到运行,我踩过的坑都帮你避开了
- Java生成带图二维码:解决中文乱码和分辨率问题,我整理了可直接用的代码
- Python vs Java:两种工具怎么选?我整理了一张对比表
- Python安装qrcode库时提示“找不到pip”或安装失败怎么办?
- 添加logo后二维码扫不出来,是不是大小或位置错了?
- Java生成的二维码扫出来是乱码,怎么解决?
- 二维码的“容错率”是什么意思,选哪个级别好?
- 生成带图二维码,Python和Java选哪个更合适?
用Python做带图二维码:从安装到运行,我踩过的坑都帮你避开了
先讲最容易上手的Python——毕竟写几行代码就能生成,适合快速试错。首先得装库,打开命令行输pip install qrcode[pil]
——后面加[pil]
是因为要处理图片,得装PIL库(也就是Pillow)。我第一次装的时候漏了这个,结果运行代码直接报“ImportError: No module named ‘PIL’”,查了半天才知道要补装。
接下来生成基础二维码的代码其实很简单:
import qrcode
初始化二维码对象
qr = qrcode.QRCode(
version=1, # 二维码大小(1-40,越大越复杂)
error_correction=qrcode.constants.ERROR_CORRECT_H, # 容错率(H是最高,挡住15%也能扫)
box_size=10, # 每个小方块的像素大小(越大越清晰)
border=4, # 二维码四周的白边宽度
)
传入要生成二维码的内容(比如你的链接)
qr.add_data("https://www.example.com")
qr.make(fit=True)
生成黑白二维码图片
img = qr.make_image(fill_color="black", back_color="white")
保存基础二维码
img.save("basic_qr.png")
这里要重点说容错率——我之前就是没调这个参数,默认用了最低的容错率,结果贴logo时挡住一点就扫不出来。后来查qrcode官网(https://pypi.org/project/qrcode/)才知道,ERROR_CORRECT_H
是最高容错率,能扛住15%的遮挡,适合加logo的场景。
接下来加logo——这一步最容易踩坑。我第一次加logo时,直接把朋友的甜品店logo(200×200像素)贴上去,结果挡住了二维码三个角的定位点(就是三个小方块),顾客根本扫不出来。后来才搞明白:logo的大小要控制在二维码的1/5到1/4,位置要放在正中间,别碰定位点。正确的代码是这样的:
from PIL import Image
打开logo图片( 用PNG格式,支持透明背景)
logo = Image.open("logo.png")
调整logo大小(比如二维码是400x400,logo就设为80x80)
logo = logo.resize((80, 80))
计算logo的位置(正中间)
pos = ((img.size[0]
logo.size[0]) // 2, (img.size[1] logo.size[1]) // 2)
贴logo(mask参数保留logo的透明背景)
img.paste(logo, pos, mask=logo)
保存带logo的二维码
img.save("qr_with_logo.png")
我 你先试基础版的二维码,确认能扫出来,再加logo——我之前就是急着加logo,结果基础版都没调好,白折腾半天。 如果你的logo有白边,可以用在线工具转成PNG透明背景(比如站长工具的“图片去白边”),这样贴上去不会突兀。
Java生成带图二维码:解决中文乱码和分辨率问题,我整理了可直接用的代码
如果是做企业级项目(比如给App生成分享码),Java的ZXing库会更稳定——功能强,支持多种编码,还能处理中文。但Java的步骤比Python复杂一点,我去年做项目时,光解决中文乱码就花了半天。
首先得导入ZXing的依赖——如果用Maven,在pom.xml
里加:
com.google.zxing
core
3.5.1
com.google.zxing
javase
3.5.1
接下来生成二维码的核心代码,重点是解决中文乱码和提升分辨率:
import com.google.zxing.;
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 javax.imageio.ImageIO;
import java.awt.
;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class QRCodeGenerator {
public static void main(String[] args) throws WriterException, IOException {
// 要生成二维码的内容(中文链接也能处理)
String content = "https://www.甜品店.com/满减券";
// 二维码宽度和高度(设为500,生成的二维码更清晰)
int width = 500;
int height = 500;
// 配置参数(关键:设置UTF-8编码解决中文乱码)
Map hints = new HashMap();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 中文编码
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 高容错率
hints.put(EncodeHintType.MARGIN, 2); // 白边宽度
// 生成二维码矩阵
QRCodeWriter writer = new QRCodeWriter();
BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints);
// 转成BufferedImage(方便后续处理图片)
BufferedImage qrImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
// 加logo(和Python思路一样,调整大小+贴中间)
File logoFile = new File("logo.png");
BufferedImage logo = ImageIO.read(logoFile);
// 调整logo大小为二维码的1/5
int logoWidth = qrImage.getWidth() / 5;
int logoHeight = qrImage.getHeight() / 5;
Image scaledLogo = logo.getScaledInstance(logoWidth, logoHeight, Image.SCALE_SMOOTH); // 平滑缩放,避免模糊
// 绘制logo到二维码上
Graphics2D g = qrImage.createGraphics();
int x = (qrImage.getWidth()
logoWidth) / 2;
int y = (qrImage.getHeight()
logoHeight) / 2;
g.drawImage(scaledLogo, x, y, null);
g.dispose(); // 释放资源
// 保存带logo的二维码
ImageIO.write(qrImage, "png", new File("java_qr_with_logo.png"));
}
}
这里要注意两个点:一是中文乱码——ZXing默认用ISO-8859-1编码,所以必须加hints.put(EncodeHintType.CHARACTER_SET, "UTF-8")
,不然中文链接会变成乱码;二是分辨率——我之前把width和height设为200,生成的二维码模糊得像像素画,后来改成500,扫的时候清晰多了。 Image.SCALE_SMOOTH
是平滑缩放,能让logo更清晰,比默认的拉伸效果好太多。
Python vs Java:两种工具怎么选?我整理了一张对比表
很多人问我“Python和Java哪个更适合做二维码”,其实要看场景——我做了张表,你对着选就行:
工具库 | 优势 | 适用场景 | 避坑提醒 |
---|---|---|---|
Python qrcode | 语法简单,5分钟就能跑通;支持快速调整样式 | 个人朋友圈分享、小店铺临时用码 | logo大小≤二维码1/5,避免遮挡定位点;必须装qrcode[pil] |
Java ZXing | 功能稳定,支持企业级并发;完美处理中文/特殊字符 | App分享码、电商活动码、需长期使用的企业码 | 必须设UTF-8编码;width/height≥500保证清晰度 |
现在把代码都给你了,你直接复制过去——改改content
(换成你自己的链接)、logo
路径(换成你电脑里的文件),就能生成带图的二维码。我去年帮朋友做的甜品店分享码,用的就是Python的方法,顾客扫了之后能直接进店铺的朋友圈领券,三个月下来,分享量比之前涨了30%。
如果你试的时候遇到问题——比如代码报错“找不到logo文件”、生成的码扫不出来,或者logo有白边——欢迎回来留言告诉我。毕竟我踩过的坑,不想让你再踩一遍!
你用Java生成二维码,扫出来全是问号或者乱码字符,是不是特别崩溃?我之前帮做电商的朋友调过这个问题——他生成的“限时折扣”活动码,顾客扫了之后显示一堆乱码,还以为是链接失效了,急得他直找我帮忙。其实这事儿根源特简单,就是编码的问题!ZXing这个库默认用的是ISO-8859-1编码,这玩意儿压根不认识中文——你输个带中文的链接(比如“https://www.甜品店.com/满减券”)或者文字,它就会把中文当成陌生字符乱转,扫出来能对才怪呢。
解决办法就一行代码的事儿,你在配置参数的hints里加这么一句:hints.put(EncodeHintType.CHARACTER_SET, “UTF-8”)。这行代码就是明确告诉ZXing“我要传中文内容,你得用UTF-8编码处理啊”。之前文章里的Java代码已经帮你把这一步写好了,你直接复制过去用就行,不用自己瞎琢磨——我朋友就是照这个改的,改完之后扫出来的链接清清爽爽,顾客点进去直接领折扣券,活动最后销量比预期涨了20%。对了,要是你自己写代码,可千万别漏了这行,不然又得像我朋友似的,盯着乱码挠头半天,最后发现是这么小的细节没注意。
Python安装qrcode库时提示“找不到pip”或安装失败怎么办?
首先检查pip是否正常:打开命令行输pip version,若没反应,先升级pip(用python -m ensurepip upgrade)。若安装慢或失败,换国内镜像源,比如清华源:pip install qrcode[pil] -i https://pypi.tuna.tsinghua.edu.cn/simple,能解决网络超时问题。
添加logo后二维码扫不出来,是不是大小或位置错了?
大概率是!logo大小要控制在二维码的1/5到1/4(比如二维码500×500像素,logo就80-100像素),位置必须在正中间,绝对不能遮挡二维码三个角的“定位点”(三个小方块)。 先生成基础二维码确认能扫,再加logo。
Java生成的二维码扫出来是乱码,怎么解决?
这是中文编码问题!ZXing默认用ISO-8859-1编码,必须在配置参数里加hints.put(EncodeHintType.CHARACTER_SET, “UTF-8”),确保中文内容(比如链接、文字)能正确编码,文章里的Java代码已包含这一步,直接复制即可解决。
二维码的“容错率”是什么意思,选哪个级别好?
容错率是二维码被遮挡后仍能正常扫描的比例,文章中推荐的ERROR_CORRECT_H是最高级别,即使二维码被遮挡15%也能识别,适合添加logo的场景;如果不需要加图,选M或L级别也可以,但加logo必须用H级。
生成带图二维码,Python和Java选哪个更合适?
看使用场景:个人朋友圈分享、小店铺临时用码选Python(语法简单,快速试错);企业级项目(比如App分享码、长期活动码)选Java(ZXing库更稳定,支持并发,处理中文更可靠)。