之前就写过很多关于二维码的东西,一直没有时间整理一下,所以呢今天就先来介绍一下如何利用java开发二维码。生成二维码有很多jar包可以实现,例如Zxing,QRcode,前者是谷歌的,后者日本的,这里我将对这两种方式的具体实现方法做简单介绍。
一、二维码的原理
二维条形码最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理。
二、具体实现
1.QRcode
(1).获取QRcode.jar, 下载链接:http://www.swetake.com/qrcode/java/qr_java.html (官网) http://download.csdn.net/download/xch_yang/9514836
(2).将jar包添加进项目的构建路径(将jar包复制到项目下,右键:构建路径--添加至构建路径)。
代码如下:
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.imageio.ImageIO;
import com.swetake.util.Qrcode; public class QrcodeImg {
/**
* 生成二维码图片
* @author 杨雄超
* @param content 二维码内容
* @param imgPath 二维码图片的保存路径
*/
public static void getQrcodeImg(String content,String imgPath){
int width=;
int height=;
//实例化Qrcode
Qrcode qrcode=new Qrcode();
//设置二维码的排错率L(7%) M(15%) Q(25%) H(35%)
qrcode.setQrcodeErrorCorrect('M');
qrcode.setQrcodeEncodeMode('B');
//设置二维码尺寸(1~49)
qrcode.setQrcodeVersion();
//设置图片尺寸
BufferedImage bufImg=new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); //绘制二维码图片
Graphics2D gs=bufImg.createGraphics();
//设置二维码背景颜色
gs.setBackground(Color.WHITE);
//创建一个矩形区域
gs.clearRect(, , width, height);
//设置二维码的图片颜色值 黑色
gs.setColor(Color.BLACK); //获取内容的字节数组,设置编码集
try {
byte[] contentBytes=content.getBytes("utf-8");
int pixoff=;
//输出二维码
if(contentBytes.length>&&contentBytes.length<){
boolean[][] codeOut=qrcode.calQrcode(contentBytes);
for(int i=;i<codeOut.length;i++){
for(int j=;j<codeOut.length;j++){
if(codeOut[j][i]){
gs.fillRect(j*+pixoff, i*+pixoff, , );
}
}
}
}
gs.dispose();
bufImg.flush();
//生成二维码图片
File imgFile=new File(imgPath);
ImageIO.write(bufImg, "png", imgFile); System.out.println("二维码生成成功!"); } catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } public static void main(String[] args) {
getQrcodeImg("http://m.55bbs.com/liren_2003609/", "E:\\test.png");
}
}
结果:内容为网页图片的链接,所以扫描之后结果如图,当然,你可以将内容换成文字。
2.ZXing
(1).获取ZXing包, 下载链接:http://download.csdn.net/detail/xch_yang/9514956
(2)这里我们只需要Zxing包中的core-3.0.0.jar,所以将core-3.0.0.jar添加至构建路径。
实现代码:
创建类:ImageWrite(二维码的生成需要借助这个类)
import javax.imageio.ImageIO;
import java.io.File;
import java.io.OutputStream;
import java.io.IOException;
import java.awt.image.BufferedImage;
public final class ImageWrite {
private static final int BLACK = 0xFF000000;
private static final int WHITE = 0xFFFFFFFF;
private ImageWrite() {}
public static BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = ; x < width; x++) {
for (int y = ; y < height; y++) {
image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
}
} return image;
}
public static void writeToFile(BitMatrix matrix, String format, File file) throws IOException {
BufferedImage image = toBufferedImage(matrix);
if (!ImageIO.write(image, format, file)) {
throw new IOException("Could not write an image of format " + format + " to " + file);
}
}
public static void writeToStream(BitMatrix matrix, String format, OutputStream stream)throws IOException {
BufferedImage image = toBufferedImage(matrix);
if (!ImageIO.write(image, format, stream)) {
throw new IOException("Could not write an image of format " + format);
}
}
}
创建类:QRcodeEncode
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix; public class QRcodeEncode { public static void main(String[] args) {
try {
//二维码内容
String content = "Hello QRcode!";
//二维码生成路径
String path = "F:/java workspace";
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
Map hints = new HashMap();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, , ,hints);
File file1 = new File(path,"test.jpg");
ImageWrite.writeToFile(bitMatrix, "jpg", file1);
System.out.println("二维码已生成!");
} catch (IOException e) {
e.printStackTrace();
} catch (WriterException e) {
e.printStackTrace();
}
}
}
结果:二维码图片所在位置:F:/java workspace/test.jpg 扫描内容:Hello QRcode!
这里简单的介绍了利用java开发二维码的两种方式,当然还可以向二维码中添加logo,实现方式后续介绍。
两个jar包可关注我公众号ChaoYoung,回复“jar包”直接获取。
转载请注明:http://www.cnblogs.com/xch-yang/p/5475869.html
更多技术干货,欢迎关注我的公众号:ChaoYoung
java二维码开发的更多相关文章
-
【转】Android平台下利用zxing实现二维码开发
http://www.cnblogs.com/dolphin0520/p/3355728.html 现在走在大街小巷都能看到二维码,而且最近由于项目需要,所以研究了下二维码开发的东西,开源的二维码扫描 ...
-
Android平台下利用zxing实现二维码开发
Android平台下利用zxing实现二维码开发 现在走在大街小巷都能看到二维码,而且最近由于项目需要,所以研究了下二维码开发的东西,开源的二维码扫描库主要有zxing和zbar,zbar在iPos平 ...
-
(转载)Android平台下利用zxing实现二维码开发
Android平台下利用zxing实现二维码开发 现在走在大街小巷都能看到二维码,而且最近由于项目需要,所以研究了下二维码开发的东西,开源的二维码扫描库主要有zxing和zbar,zbar在iPos平 ...
-
Atitit java 二维码识别 图片识别
Atitit java 二维码识别 图片识别 1.1. 解码11.2. 首先,我们先说一下二维码一共有40个尺寸.官方叫版本Version.11.3. 二维码的样例:21.4. 定位图案21.5. 数 ...
-
java二维码生成-谷歌(Google.zxing)开源二维码生成学习及实例
java二维码生成-谷歌(Google.zxing)开源二维码生成的实例及介绍 我们使用比特矩阵(位矩阵)的QR码编码在缓冲图片上画出二维码 实例有以下一个传入参数 OutputStream ou ...
-
Java二维码生成与解码
基于google zxing 的Java二维码生成与解码 一.添加Maven依赖(解码时需要上传二维码图片,所以需要依赖文件上传包) <!-- google二维码工具 --> &l ...
-
[二维码开发]二维码开发入门级demo
最近开发一个项目,涉及到二维码开发,于是乎就到网上找下直接可用的资源,遇到两个问题: 1.网上资源不够完整,找到完整的资源,需要下载分,这个你知道的 2.ThoughtWorks.QRCode版本不对 ...
-
Android开发 QRCode二维码开发第三方框架
前言 Android开发里二维码开发经常用到,这里简单的介绍下Android开发里的二维码. 最广泛使用的二维码库zxing zxing是最广泛的二维码库各个平台都可以适用它,但是Android平台使 ...
-
[转]java二维码生成与解析代码实现
转载地址:点击打开链接 二维码,是一种采用黑白相间的平面几何图形通过相应的编码算法来记录文字.图片.网址等信息的条码图片.如下图 二维码的特点: 1. 高密度编码,信息容量大 可容纳多达1850个大 ...
随机推荐
-
[团队项目]----Math Calculator
团队项目 ----Math Calculator 任务: 1.每个团队从Github上fork这个项目的源代码 https://github.com/RABITBABY/We-have-bing 2. ...
-
Mac支付宝插件风波
1.前言 首先我喜欢看一些创业的书,很多书里都会有马云的身影,马云也算是对我有一定的影响,从而我对淘宝也产生了一定的好感.但是关于这次插件事情,我对阿里产生了一些排斥的心里作用.我并不想吐槽淘宝,也不 ...
-
WCF测试工具,post经验
以前使用WCF的post的时候总是不知道怎么传值,需要注意2方面 1.头可以用Json或者是xml来传值 Content-Type: application/json; charset=utf-8 2 ...
-
Activiti 工作流得到最后一次批注的时间
我们有时候在工作流开发中可能会遇到这样的需求,就是已经审批结束的流程,可能我们还是仍然需要修改业务表的结果,而且我们需要一个时间期限,比如:在5天内可以进行修改 ,这个时候我们就需要得到我们最后一步审 ...
-
世界最大射电望远镜(Arecibo)用于探測地外文明
请看下图: 这是眼下世界最大口径(305米)射电望远镜的外观图,位于美国中西部的PuertoRico州,建成于1963年,工作波段在3厘米至1米波段范围内,正好适合用于探測地外文明(SETI)的科学研 ...
-
css备忘录(关于relative、absolute)
父级用:position: relative; 子级才能用:position: absolute; relative里面用margin调位置: absolute里面用top.left.right.bo ...
-
二、Cocos2dx概念介绍(游戏开发中不同的坐标系,cocos2dx锚点)
注:ccp是cocos2dx中的一个宏定义,#define ccp(__X__,__Y__)CCPointMake((float)__X__, (float)__Y__),在此文章中表示坐标信息 1. ...
-
兼容IE8的input输入框的正确使用姿势
input是一个很常见的标签,大家使用的也很常见,但是我在具体的工作中发现要想完美的使用这个标签还是任重而道远,下面是我碰到的几个问题. 1.我们在使用这个标签的时候会习惯的加上placeholder ...
-
c#根据文件路径启动进程
//根据文件路径启动进程 private static void StartProcessByFilePath(string path) { Process p = new System.Diagno ...
-
3DES加密及.NET弱密钥处理
背景 智能pos机开发项目需要指定Key加密某些关键字符串.商定采用3DES加密算法. 实践 网海中很多.NET C#编写3DES加密的函数.采集一段简明.成熟的代码,归置于常用程序集.但当指定Key ...