所有分类
  • 所有分类
  • 游戏源码
  • 网站源码
  • 单机游戏
  • 游戏素材
  • 搭建教程
  • 精品工具

二维码生成图片源码的方法|Python/Java手把手教程及可直接运行代码

二维码生成图片源码的方法|Python/Java手把手教程及可直接运行代码 一

文章目录CloseOpen

用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库更稳定,支持并发,处理中文更可靠)。

    原文链接:https://www.mayiym.com/47158.html,转载请注明出处。
    0
    显示验证码
    没有账号?注册  忘记密码?

    社交账号快速登录

    微信扫一扫关注
    如已关注,请回复“登录”二字获取验证码