用JAVA自己画一张二维码

我们都知道,最近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,如果没记错的话~

写在最后

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值