【Java,二维码】Java 使用 swetake 生成二维码图片

关于java生成二维码:QR Code QR Code的生成和读取在两个文件....... 阅读详情

重要声明:本文章仅仅代表了作者个人对此观点的理解和表述。读者请查阅时持自己的意见进行讨论。

本文原文地址:【Java,二维码】Java 使用 swetake 生成二维码图片,本文更新不及时,建议到原文地址浏览。

二维码又称二维条码,是1994年由日本DW公司发明。常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。

一、分类和步骤

按照二维码的原理,通常将二维码分为两类,分别是:堆叠式/行排式 和 矩阵式。平时生活中常接触到的就是矩阵式二维码。偶尔也能看到在某些包装设备上看到堆叠式/行排式二维码。下图展示了它们的区别和外观。

图1

人们最常用的二维码是矩阵式,因此本文所介绍的内容也是矩阵式的二维码。二维码从原始数据到图像生成,笔者将其归纳为两步:

  1. 计算:根据原始数据,计算出一个二维数组。
  2. 绘制:根据二维数组里每个元素的true和false判断绘制黑点还是白点。

二、计算二维码

二维码绘制这里将通过第三方jar包完成,因此需首先下载jar包。

1、下载 jar

日本DW公司发明了二维码,同时我也发现了一个日本网站里写的二维码工具,我们不必深究二维码的具体原理,就可以直接下载开发工具包进行二维码绘制了。首先打开其工具官网 http://www.swetake.com 就可以很简单的下载到java开发包了,除了java开发包,该网站还提供了适用于php的,本文将只对java的进行讲解。如果你打开这个网站有难度,你可以直接通过此地址下载:链接: 百度网盘 提取码: qz22。

2、使用 swetake

下载完成后,提取出其中 lib 目录下的 Qrcode.jar 包,将其放在你自己的项目依赖里就可以开始使用了。这个工具使用方式非常简单,它只提供了一个类,几乎没有比这更简单的实现二维码计算的了。这个类就是 com.swetake.util.Qrcode 它提供了一个公共的无参构造函数,意味着你可以不需要任何参数,直接构建一个对象。下面示列了一个非常容易的计算二维码的代码:

// 创建二维码工具对象。
Qrcode qrcode = new Qrcode();

// 使用内容计算二维码结果。
boolean[][] booleans = qrcode.calQrcode("Hello Qrcode!".getBytes("UTF-8"));

是的,只需要这两行代码即可将字符串"Hello Qrcode!"的二维码结果计算出来。calQrcode 方法需要二进制数组作为参数,因此将字符串通过UTF-8编码获取到二进制数组,然后传入进行计算。由于二维码图像只有两种颜色,要么某个点位是黑色的、要么某个点位不是黑色的。就这两种状态。何不就使用一个 boolean 二位数组来表达。咱们先不说如何得到图形,通过嵌套for循环,不如先看看这个二维数组的庐山真面目:

for (boolean[] aBoolean : booleans) {
    for (boolean b : aBoolean) {
        System.out.print((b ? "■" : " ") + " ");
    }
    System.out.println();
}

执行打印之后,即可看到下图的结果:

不过很遗憾,这张图很难用手机扫描出结果。不着急,这是因为我们使用了不规范的方式生成的图像,中间毕竟生成了一些空格。一旦你距离此图远一点扫描(1.5米左右),也一样能很快识别。但至少目前我们看到了这个二维数组的真实结果,它无疑可以作为依据来绘制一张无误的二维码图像。

三、绘制二维码

绘制二维码涉及到了图像的生成,不同平台下针对图像的生成有不同的解决方案,因此本文将针对不同平台进行分别介绍。

1、Java服务端绘制

使用Java绘制图像可使用 BufferedImage 进行实现。这个类是java提供的 AWT抽象窗口工具包 下的类。因此请注意,在部分 Android 平台下此类可能无法使用,下文将同样给出在Android 下绘制二维码的方法。那么使用 BufferedImage 可常用于Java服务端的二维码生成。

BufferedImage 的构造函数共有3个,最简单的一个构造函数都需要三个参数。宽度、高度以及图像类型,相信这些都非常好理解。那不如先来试一试绘制:

Qrcode qrcode = new Qrcode();
boolean[][] booleans = qrcode.calQrcode("Hello Qrcode!".getBytes("UTF-8"));

// 建立图像对象,大小直接使用boolean二维数组的长度。
BufferedImage image = new BufferedImage(booleans.length, booleans.length, BufferedImage.TYPE_INT_RGB);
// 拿到图像画板,所有绘制操作都通过此对象完成。
Graphics graphics = image.getGraphics();

// 遍历绘制
for (int i = 0; i < booleans.length; i++) {
    boolean[] bs = booleans[i];
    for (int i1 = 0; i1 < bs.length; i1++) {
        boolean b = bs[i1];

        // 如果为真就绘制黑色,为假就绘制白色。
        graphics.setColor(b ? Color.BLACK : Color.WHITE);
        // 在对应位置绘制1像素点的矩形。
        graphics.fillRect(i, i1, 1, 1);
    }
}
graphics.dispose();

// 将图像输出到文件
ImageIO.write(image, "jpg", new File("D:/qrcode_demo.jpg"));

上述代码中图像类型为RGB,这是没有透明颜色支持,如果需要白色区域是透明的,可以使用ARGB类型的图像模式。现在运行程序,打开D盘,找到文件:“D:/qrcode_demo.jpg”,是的你要的二维码图像来了,看下图:
图3

很小。因为我们在构造图像大小的时候,使用数组的长度作为图像的宽度和高度,这样就使得一个点位仅有一个像素点。为了能让图像变大我们应该让一个点位绘制在更多的像素点上,让图像变大。

但是注意,考虑到图像的清晰度和完整性,目前我们已经有了二维码的boolean数组结果,也就意味着我们知道这个二维码的宽高有几个点了。如果我们随便指定一个图像宽度而这个宽度不是数组长度的整数倍,那么在绘制时势必会出现数组越界或者图像超出等问题。比如,上方的二维码结果数组长度是21, 希望将这个数组绘制在一个宽度为100的图像上,而恰巧100不是21的整数倍,这是无疑就为我们的绘制带来了更多的问题。

难道就不能画在一个100宽高的图上了吗,没有一个优雅的方法吗?当然有,不过这只是笔者想出的解决方案,自己如果有更完美的方案当然可以忽略此方案。具体实现就是:可以通过图像缩放的方式将图像缩放到我预期的大小。最初的绘制还是绘制为1点1像素的大小,后期通过缩放实现具体的大小。这样不就可以将任意点数的二维码绘制到我指定的图像大小上了。也保证扫描成功的可能性。那么现在可以据此来修缮一下上方的绘制代码:

Qrcode qrcode = new Qrcode();

boolean[][] booleans = qrcode.calQrcode("Hello Qrcode!".getBytes("UTF-8"));

// 建立图像对象,大小直接使用boolean二维数组的长度。
BufferedImage image = new BufferedImage(booleans.length, booleans.length, BufferedImage.TYPE_INT_RGB);

// 拿到图像画板,所有绘制操作都通过此对象完成。
Graphics graphics = image.getGraphics();

// 遍历绘制
for (int i = 0; i < booleans.length; i++) {
    boolean[] bs = booleans[i];
    for (int i1 = 0; i1 < bs.length; i1++) {
        boolean b = bs[i1];

        // 如果为真就绘制黑色,为假就绘制白色。
        graphics.setColor(b ? Color.BLACK : Color.WHITE);

        // 在对应位置绘制1像素点的矩形。
        graphics.fillRect(i, i1, 1, 1);
    }
}
graphics.dispose();

// 将图像缩放到指定大小。
// 构造目标大小的图像
BufferedImage qrImg = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
graphics = qrImg.getGraphics();

// 将原始二维码缩放绘制到目标二维码图像上
graphics.drawImage(image, 0, 0 , qrImg.getWidth(), qrImg.getHeight(), null);

graphics.dispose();

// 将目标二维码图像输出到文件
ImageIO.write(qrImg, "jpg", new File("D:/qrcode_demo.jpg"));

现在,重新运行程序。将生成一个比原来更加适合且美观的二维码。如图:

图5

最终,整理一下代码,一个完整的绘制二维码的工具方法诞生了:

/**
 * 根据指定内容生成二维码图像。 此方法不一定适用于android。
 * @param content 文本内容。
 * @param size 二维码大小。
 * @return 二维码图像文件的二进制内容。
 */
public static byte[] getQrcodeImg(String content, int size) throws Exception {

    Qrcode qrcode = new Qrcode();

    boolean[][] booleans = qrcode.calQrcode(content.getBytes("UTF-8"));

    // 建立图像对象,大小直接使用boolean二维数组的长度。
    BufferedImage image = new BufferedImage(booleans.length, booleans.length, BufferedImage.TYPE_INT_RGB);

    // 拿到图像画板,所有绘制操作都通过此对象完成。
    Graphics graphics = image.getGraphics();

    // 遍历绘制
    for (int i = 0; i < booleans.length; i++) {
        boolean[] bs = booleans[i];
        for (int i1 = 0; i1 < bs.length; i1++) {
            boolean b = bs[i1];

            // 如果为真就绘制黑色,为假就绘制白色。
            graphics.setColor(b ? Color.BLACK : Color.WHITE);

            // 在对应位置绘制1像素点的矩形。
            graphics.fillRect(i, i1, 1, 1);
        }
    }
    graphics.dispose();

    // 将图像缩放到指定大小。
    // 构造目标大小的图像
    BufferedImage qrImg = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB);
    graphics = qrImg.getGraphics();

    // 将1原始二维码缩放绘制到目标二维码图像上
    graphics.drawImage(image, 0, 0 , qrImg.getWidth(), qrImg.getHeight(), null);

    graphics.dispose();

    // 将目标二维码图像输出
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ImageIO.write(qrImg, "jpg", out);
    out.flush();

    return out.toByteArray();
}
2、Android端绘制

Android 中提供了 Bitmap 实现图像的绘制,因此使用 Bitmap 可以在任何一台 android设备中得到兼容。为了支持任意大小图形绘制二维码,android同样的将采取和上一节相同的方式,先绘制1点一像素的二维码,然后进行缩放到指定大小。由于原理相同,本节只对绘制做介绍。

Canvas 类提供了Android上绘制功能的完成,因此,绘制图像时,需要 canvas 和 bitmap 结合,才能完成。而完整的绘制还需要画笔Paint的加入,因此完整的绘制使用如下:

// 建立图像对象
Bitmap bitmap = Bitmap.createBitmap(10, 10, Bitmap.Config.RGB_565);

// 建立图像画板,所有绘制操作都通过此对象完成。
Canvas canvas = new Canvas(bitmap);
// 建立画笔
Paint paint = new Paint();

// 在画板左上角第一个像素点绘制一个红点:
paint.setColor(Color.red);
canvas.drawPoint(0, 0, paint);

有了上面的基础绘制知识后,便可以完成Android平台上的二维码图像的绘制了:

/**
 * 获取指定字符串的二维码图像。
 * @param content 字符串内容。
 * @param size 图像大小,单位px。
 * @return 返回Bitmap的二维码图形。
 * @throws Exception 错误。
 */
public static Bitmap getQrcodeImg(String content, int size) throws Exception {
    Qrcode qrcode = new Qrcode();
    boolean[][] booleans = qrcode.calQrcode(content.getBytes(Charset.forName("UTF-8")));
    // 建立图像对象,大小直接使用boolean二维数组的长度。
    Bitmap bitmap = Bitmap.createBitmap(booleans.length, booleans.length, Bitmap.Config.RGB_565);
    // 建立图像画板,所有绘制操作都通过此对象完成。
    Canvas canvas = new Canvas(bitmap);
    // 建立画笔
    Paint paint = new Paint();
    // 遍历绘制
    for (int i = 0; i < booleans.length; i++) {
        boolean[] bs = booleans[i];
        for (int i1 = 0; i1 < bs.length; i1++) {
            boolean b = bs[i1];
            // 如果为真就绘制黑色,为假就绘制白色。
            paint.setColor(b ? Color.BLACK : Color.WHITE);
            // 在对应位置绘制1像素点。
            canvas.drawPoint(i, i1, paint);
        }
    }

    // 建立目标大小的图像
    Bitmap qrBitMap = Bitmap.createBitmap(size, size, Bitmap.Config.RGB_565);
    Canvas qrCanvas = new Canvas(qrBitMap);

    // 将上面已绘制好的二维码缩放绘制到目标图上中。
    qrCanvas.drawBitmap(bitmap,
            new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()),
            new Rect(0, 0, qrBitMap.getWidth(), qrBitMap.getHeight()),
            paint
    );

    // 丢弃已不再需要的初始二维码。
    bitmap.recycle();

    // 返回目标图像。
    return qrBitMap;
}

四、注意事项

本文绘制的所有二维码都不包含图像四周的空白,一般来说,二维码四周都应该有一点空白。使用时务必按自己的需求对代码稍作修改,以达到四周留白的效果。

qrcode生成,二维码生成 首先倒进jar包qrcode_swetake.jar 剩下的复制粘贴下面代码就可以了 package com.lgt.qrcode; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io. 阅读详情

相关推荐

com.swetake.QRCode

二维码生成com.swetake.QRCode

基于swetake生成二维码

package QRCodeDemo; public class QRCodeDemo { public static void main(String[] args) throws Exception{ //生成二维码的位置 String imgPath = "src/img/first"; //生成二维码的内容 St...

qq_40663637的博客 1088

Qrcode生成二维码(Java web项目方法示例)

java web项目使用qrcode创建二维码方法示例,生成二维码图片目录在webroot目录下的qrcode文件夹下,生成前会自动判断目录是否存在并生成图片二维码。

java实现二维码([带]logo)的绘制和解析(swetake.util.Qrcode)

使用jar:qrcode.jar和源码twodimensioncode: 1:绘制二维码: package com.tsxs.tools.twodimensioncode; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; i...

weixin_34178244的博客 592

二维码必须jar包,Qrcode_swetake.jar,qrcode.jar

java中二维码生成和解析的必须jar包,欢迎下载使用。里面还有生成和解析代码。

【Macbook-Latex安装部署教程】【Win-Texlive镜像下载】【简单易上手】MacTex+Vscode/Texstudio

该教程记录自己在mac()上安装部署Latex环境的经验,整个教程操作简单,配置要求少,易上手。教程分成三部分:Mactex下载与安装,Vscode插件下载与配置文件修改,Texstudio安装。

sunriseOvO的博客 2568

Java 生成二维码

简述: Java调用swetake库生成二维码 步骤: 1. 在Maven中添加一个库的依赖项 swetake qrcode 0.5 2. 生成二维码图片,并返回该File类型文件(自己实现的) content:需要二维码图片存入的数据String类型 filePath: 存放的文件夹路径 size: 可以根据自己需要实现不同大小的

霖林烟雨 2126

[捷稀 JCG Q30 Pro 刷机说明] 以刷入openwrt24.10为例

摘要: 本文详细介绍了捷稀JCG Q30 Pro路由器刷入OpenWrt 24.10系统的步骤。通过先刷入OpenWrt 23.05过渡固件,再升级Uboot,最后通过TFTP加载工厂镜像完成刷机。关键步骤包括解锁分区、刷写Uboot、进入恢复模式及配置网络。文章还提供了无线设置、Tailscale内网穿透等进阶命令,并附参考文档和固件下载链接。适用于有一定技术基础的玩家,需注意操作风险,严格按流程执行。

贤时间 7138

java+qrcode的二维码带有logo和文字描述

学习中 import com.swetake.util.Qrcode; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class CreateQRCode { public static void main(String[] args) throws IOEx

m0_52914401的博客 612

如何在SendWS实现WhatsApp批量群发设置管理?WhatsApp群发超链有什么好处?

WhatsApp群发顾名思义就是对WhatsApp上的用户好友进行群发消息,给他们群发想要发送的消息。及时不认识对方也可以对他进行群发超链。越来越多做跨境出海运营的工作者利用WhatsApp进行营销推广,因为他能做到低成本高回报,向客户发送消息曝光自己的品牌或产品,使得更多人了解,拓展新客户,提高成交率。

SendWS-WS云控群控拓客聊天翻译 1169

C#跨平台制图新纪元:Mapsui,一库在手,地图我有

深入学习Mapsui的渲染机制,定制属于你的地图样式,无论是颜色、图标还是文字,都可以随心所欲。

java专栏 1457

swetake实现生成带logo的二维码

swetake包已实现二维码的实现, 但依然需要我们根据数据去画QR Code图,如果需要添加logo到二维码图片上,依然需要我们自己去实现。 所以自己实现了在二维码添加logo图片, 现在把代码分享出来 并附带了详细的注释。 importjava.awt.Color;...

chuangwu2528的博客 251

SAP SEGW 事物码里的 Function Import

开放数据协议(OData)包括标准的 CRUD (创建、检索、更新和删除)操作,这些操作映射到 HTTP 方法的 POST、GET、PUT/MERGE 和 Delete 几类。此外,OData还支持进一步的服务操作:,这些操作可以由HTTP方法GET或POST调用,用于处理不能映射到标准 CRUD 操作的任何内容。通过在数据模型中创建 ,可以在 service Builder 中实现此类额外的服务操作。例如,您可以为以下自定义操作创建函数导入:Work Item confirmation检查航班的可用性虽然

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 995

Java生成直接页面输出二维码,但不保存二维码图片

在Java中生成的二维码不存到磁盘里要直接输出到页面上,这就需要把生成的二维码直接以流的形式输出到页面上 原理:在加载页面时,根据img的src(code.jspx)找到对应的servlet(CodeServlet),在servlet中编辑二维码中的内容,调用生成二维码的类EncoderHandler中的encoderQRcoder方法 1.首先要导入jar包(将jar包放到lib目录

kimiHuan优快云的博客 6755

FM收音机调试-RDA5807M

收音机调试 IC型号:RDA5807M

mangofu的博客 6164

带图片二维码生成

注: * 依赖包Qrcode_swetake.jar * 生成的二维码图片的大小是会根据所压缩的信息内容而变化的, * 网上提供的例子是通过new BufferedImage(139, 139, BufferedImage.TYPE_INT_RGB); * 来创建图像对象的,默认的情况下图片的大小是139*139,这个大小是适合QrcodeVersion为7的情况。 * 将图片的大小设置到3

wjcommen的博客 814

【DL经典回顾】距离度量大汇总(7-余弦距离(Cosine Distance))

余弦距离(Cosine Distance)衡量的是两个向量在方向上的差异性,而不是在大小上的差异。

悦学共鸣,温柔以待,汇聚光芒,共同成长 2579

java Qrcode方式生成二维码

import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import com.swetake.util.Qrcode; public class PubTool { /**

徐本锡的专栏 134万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

二维码生成代码(Java)

生成二维码是开发中常用到的,故此总结了Java生成二维码的代码!

caoyongftp的博客 685

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

你有没有使用java生成过二维码?(一)

前言 本文是通过QRCode生成的二维码 兄弟篇(使用zxing生成):java代码生成二维码(二) JAR包 只给代码,不给jar包就是耍流氓n(*≧▽≦*)n 产生二维码需要用到jar包: 链接:点我下载 密码:srw7 package erweima; import java.awt.Color; import java.awt.Graphics2D; import ja...

前方一片光明 7708

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java生成带头像的二维码

package com.liuxingyu;import java.awt.Color;import java.awt.Graphics2D;import java.awt.Image;import java.awt.p_w_picpath.BufferedImage;import java.io.File;import javax.p_w_picpathio.ImageIO...

weixin_34310369的博客 768

Java实现二维码QRCode的编码和解码

周末试用下Android手机的二维码扫描软件,扫描了下火车票、名片等等,觉得非常不错很有意思的。当然Java也可以实现这些,现在就分享下如何简单用Java实现二维码中QRCode的编码和解码(可以手机扫描验证)。 涉及到的一些主要类库,方便大家下载: 编码 lib:Qrcode_swetake.jar (官网介绍 -- http://www.swetake.co...

dingqi1722的博客 117

java二维码 生成二维码

package BasicsTest; import com.swetake.util.Qrcode; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; /** * 二维码生成 * Created by xs on 2017/

sinat_22750705的博客 289

同步手绘板——二维码验证登录

通过手机扫描页面生成的二维码,实现两端的联通,在这里为什么不用传统的登录方式?在我们的设想里,PC端不需要过多的操作,更多的是实时显示,截取图片保存在本地,通过扫码只需确定连接关系即可。 二维码生成代码: 1 package com.zh.ecard; 2 3 import java.awt.Color; 4 import java.awt.Graphic...

dinghuiyi7107的博客 185

java 生成 二维码

blog迁移至 :http://www.micmiu.com   周末试用下Android手机的二维码扫描软件,扫描了下火车票、名片等等,觉得非常不错很有意思的。当然Java也可以实现这些,现在就分享下如何简单用Java实现二维码中QRCode的编码和解码(可以手机扫描验证)。       涉及到的一些主要类库,方便大家下载: 编码 lib:Qrcode_swetake.jar  

shine4j的专栏 530
上一篇: 【JavaScript】Promise教程、Promise的使用。
下一篇: 【JQuery】JQuery常用方法总结、大全。
Microanswer
博客等级 码龄10年 38粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值