用JAVA自己画一张二维码

简介: 我们都知道,最近2年移动支付在中国堪称新四大发明之一。二维码无处不在,特别是最近的支付宝扫码领红包,微信,qq,到处在发,阿里有点攻占腾讯移动支付市场的势头啊~博主忽然就对二维码是怎么画的有了点好奇,然后自己就整了一下,整体看下来比较简单,好了废话不多说,直接上码~1,新建一个工程,如下图,命名...

我们都知道,最近2年移动支付在中国堪称新四大发明之一。

二维码无处不在,特别是最近的支付宝扫码领红包,微信,qq,到处在发,阿里有点攻占腾讯移动支付市场的势头啊~博主忽然就对二维码是怎么画的有了点好奇,然后自己就整了一下,整体看下来比较简单,好了废话不多说,直接上码~

1,新建一个工程,如下图,命名为QRcode,然后新建package 命名为code

2,新建一个类QRCode,代码如下:

package code;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.imageio.ImageIO;

import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.exception.DecodingFailedException;

import com.swetake.util.Qrcode;

public class QRCode {

/**
* 生成二维码(QRCode)图片
* @param content 存储内容
* @param imgPath 图片路径
*/
public void encoderQRCode(String content, String imgPath) {
this.encoderQRCode(content, imgPath, "png", 10);
}

/**
* 生成二维码(QRCode)图片
* @param content 存储内容
* @param output 输出流
*/
public void encoderQRCode(String content, OutputStream output) {
this.encoderQRCode(content, output, "png", 10);
}

/**
* 生成二维码(QRCode)图片
* @param content 存储内容
* @param imgPath 图片路径
* @param imgType 图片类型
*/
public void encoderQRCode(String content, String imgPath, String imgType) {
this.encoderQRCode(content, imgPath, imgType, 10);
}

/**
* 生成二维码(QRCode)图片
* @param content 存储内容
* @param output 输出流
* @param imgType 图片类型
*/
public void encoderQRCode(String content, OutputStream output, String imgType) {
this.encoderQRCode(content, output, imgType, 10);
}

/**
* 生成二维码(QRCode)图片
* @param content 存储内容
* @param imgPath 图片路径
* @param imgType 图片类型
* @param size 二维码尺寸
*/
public void encoderQRCode(String content, String imgPath, String imgType, int size) {
try {
BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);

File imgFile = new File(imgPath);
// 生成二维码QRCode图片
ImageIO.write(bufImg, imgType, imgFile);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 生成二维码(QRCode)图片
* @param content 存储内容
* @param output 输出流
* @param imgType 图片类型
* @param size 二维码尺寸
*/
public void encoderQRCode(String content, OutputStream output, String imgType, int size) {
try {
BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);
// 生成二维码QRCode图片
ImageIO.write(bufImg, imgType, output);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 生成二维码(QRCode)图片的公共方法
* @param content 存储内容
* @param imgType 图片类型
* @param size 二维码尺寸
* @return
*/
private BufferedImage qRCodeCommon(String content, String imgType, int size) {
BufferedImage bufImg = null;
try {
Qrcode qrcodeHandler = new Qrcode();
// 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小
qrcodeHandler.setQrcodeErrorCorrect('M');
qrcodeHandler.setQrcodeEncodeMode('B');
// 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大
qrcodeHandler.setQrcodeVersion(size);
// 获得内容的字节数组,设置编码格式
byte[] contentBytes = content.getBytes("utf-8");
// 图片尺寸
int imgSize = 67 + 12 * (size - 1);
bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);
Graphics2D gs = bufImg.createGraphics();
// 设置背景颜色
gs.setBackground(Color.WHITE);
gs.clearRect(0, 0, imgSize, imgSize);

// 设定图像颜色> BLACK
gs.setColor(Color.BLACK);
// 设置偏移量,不设置可能导致解析出错
int pixoff = 2;
// 输出内容> 二维码
if (contentBytes.length > 0 && contentBytes.length < 1600) {
boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
for (int i = 0; i < codeOut.length; i++) {
for (int j = 0; j < codeOut.length; j++) {
if (codeOut[j][i]) {
gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
}
}
}
} else {
throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800].");
}
gs.dispose();
bufImg.flush();
} catch (Exception e) {
e.printStackTrace();
}
return bufImg;
}

/**
* 解析二维码(QRCode)
* @param imgPath 图片路径
* @return
*/
public String decoderQRCode(String imgPath) {
// QRCode 二维码图片的文件
File imageFile = new File(imgPath);
BufferedImage bufImg = null;
String content = null;
try {
bufImg = ImageIO.read(imageFile);
QRCodeDecoder decoder = new QRCodeDecoder();
content = new String(decoder.decode(new TwoDimensionCodeImage(bufImg)), "utf-8");
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
e.printStackTrace();
} catch (DecodingFailedException dfe) {
System.out.println("Error: " + dfe.getMessage());
dfe.printStackTrace();
}
return content;
}

/**
* 解析二维码(QRCode)
* @param input 输入流
* @return
*/
public String decoderQRCode(InputStream input) {
BufferedImage bufImg = null;
String content = null;
try {
bufImg = ImageIO.read(input);
QRCodeDecoder decoder = new QRCodeDecoder();
content = new String(decoder.decode(new TwoDimensionCodeImage(bufImg)), "utf-8");
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
e.printStackTrace();
} catch (DecodingFailedException dfe) {
System.out.println("Error: " + dfe.getMessage());
dfe.printStackTrace();
}
return content;
}
}

 

3,再新建一个图片对象类TwoDimensionCodeImage ,代码如下:

package code;

import java.awt.image.BufferedImage;

import jp.sourceforge.qrcode.data.QRCodeImage;

public class TwoDimensionCodeImage implements QRCodeImage {

BufferedImage bufImg;

public TwoDimensionCodeImage(BufferedImage bufImg) {
this.bufImg = bufImg;
}

@Override
public int getHeight() {
return bufImg.getHeight();
}

@Override
public int getPixel(int x, int y) {
return bufImg.getRGB(x, y);
}

@Override
public int getWidth() {
return bufImg.getWidth();
}

}

4,最重要的部分来了,引入QRCode.jar包,如下图,(注,jar包地址就不写了,可自行百度下载~包也不大)

 

5,整个项目调试没有报错,即可。

6,我们来写一段测试代码试试,代码如下:

public static void main(String[] args) { 
String imgPath = "C:\\Users\\JJJ\\Desktop\\11.jpg"; 
String encoderContent = "曾经\r\n 有人说我帅我不承认\r\n 然后他们就打我\r\n 现在\r\n 那些说我帅的人 \r\n都用手机扫到了这张图\r\n 他们会不会又想打我~\r\n →_→ Merry Christmas~JJJ";
QRCode handler = new QRCode(); 
handler.encoderQRCode(encoderContent, imgPath, "png"); 
System.out.println("========encoder success"); 
String decoderContent = handler.decoderQRCode(imgPath); 
System.out.println("解析结果如下:"); 
System.out.println(decoderContent); 
System.out.println("========decoder success!!!"); 

7,测试结果截图如下:

 

撸完收功~

 

整个还是相对来说很简单的,因为主要的画图部分功能,都是由QRcode.jar包完成的,另外要说明的是,我们的字符串长度是有限制的,目前代码中是10*10的矩阵,如果要显示更多的字符就需要将矩阵调大。最大是44*44貌似,最小是7*7,如果没记错的话~

写在最后

忽然发现我们以后去相亲的话,自己制作一张二维码,写上工作,姓名,年龄,爱好,等等~互相扫一扫,是不是也是很方便啊~还有就是可以自己制作一张二维码发给朋友或者对象,调戏一下,也是不错的~作为一名程序员,是不是可以尽显我们的逼格~不然总以为我们只会修电脑~~

 

give me the ball!
相关文章
|
前端开发 算法 Java
1024程序员节|历经一个月总结使用java实现pdf文件的电子签字+盖章+防伪二维码+水印+PDF文件加密的全套解决方案
🍅程序员小王的博客:程序员小王的博客 🍅CSDN地址:程序员小王java 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线
1597 0
1024程序员节|历经一个月总结使用java实现pdf文件的电子签字+盖章+防伪二维码+水印+PDF文件加密的全套解决方案
|
20天前
|
存储 Java Maven
Java能这么轻松识别二维码
Java能这么轻松识别二维码
164 1
|
7月前
|
前端开发 Java Maven
Java代码生成二维码
Java代码生成二维码
|
9月前
|
JSON 小程序 Java
Java 获取小程序二维码的几种方式
Java 获取小程序二维码的几种方式
|
10月前
|
机器学习/深度学习 Java 数据安全/隐私保护
你有没有使用java生成过二维码?(二)
你有没有使用java生成过二维码?(二)
|
10月前
|
机器学习/深度学习 Java 数据安全/隐私保护
你有没有使用java生成过二维码?(一)
你有没有使用java生成过二维码?(一)
|
11月前
|
Java
java语言使用多线程导出二维码
java语言使用多线程导出二维码
|
11月前
|
小程序 网络协议 Java
微信小程序 带参二维码 纯Java实现
微信小程序 带参二维码 纯Java实现
164 0
|
文字识别 算法 Java
看懂二维码识别OCR:从算法到 API Java 接入代码
看懂二维码识别OCR:从算法到API 接入代码
8045 0
Zp
|
Java
JAVA生成跳转指定页面并且附带参数的二维码
JAVA生成跳转指定页面并且附带参数的二维码
Zp
425 0