java实现生成二维码
二维码vs条形码
最大的区别就是:二维码具有容错功能,当二维码图片被遮挡一部分后,仍可以扫描出来。容错的原理是二维码在编码过程中进行了冗余,就像是123被编码成123123,这样只要扫描到一部分二维码图片,二维码内容还是可以被全部读到。
二维码容错率即是指二维码图标被遮挡多少后,仍可以被扫描出来的能力。容错率越高,则二维码图片能被遮挡的部分越多。
二维码容错率用字母表示,容错能力等级分为:L、M、Q、H四级:
L 7%
M 15%
Q 25%
H 30%
大多数情况下,我们强烈建议采用30%的容错率。对此我们做过各种型号手机的扫描测试。结果是:对目前主流手机,在绝大多数扫描场景下,容错率越高,越容易被快速扫描!!!
如果需要对二维码进行设计,比如需要在二维码中间加logo则需要选择H级容错率的二维码。当然,高容错率的代价是图片的复杂度提高。在实际操作中应该根据需求选择相应的容错级别。
注意,二维码边上的三个定位框和中间定位小块不能被遮挡。否则容错率再高也无法扫描。
所以超市当超市里面的商品上的条形码发生损坏事件时,是不能被扫描出来的,需要龚工作人员将条形码的号码输入电脑才可以计算价格。
实现二维码的思路:
1.首先引入两个包,qrcode_a.rar和qrcode_b.rar两个包,这两个包中已经实现了创建二维码,计算二维码的许多方法,只需要应用过来用就可以了,非常方便。
2.创建一个缓冲区图片;
3.从缓冲区图片的基础上创建画笔;
4.g.clearRect(0, 0, width, height);清空画面,准备画二维码;
5.设置二维码最后实现的信息;
6.将要实现的信息转化为字节数组;
7.用boolean类型的二维数组存放二维码,如果是true则描黑,false则留白;
代码实现:
package QRcode; 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 CreatQrCode { /* * 生成二维码 */ public static void main(String[] args) throws UnsupportedEncodingException { Qrcode qrcode=new Qrcode(); //设置纠错等级 qrcode.setQrcodeErrorCorrect(‘m‘); qrcode.setQrcodeEncodeMode(‘B‘);//N 数字 A a-z B 中文,日文等等 qrcode.setQrcodeVersion(10);//版本号1-40 /* * GUI编程 */ //版本号与图片的长和宽是有联系的:这是一个固定的公式 int width=67+12*(10-1); int height=67+12*(10-1); //设置偏移量,纠正二维码在解析时的错误 int pianyiliang=2; //缓冲区图片 BufferedImage buffimmage=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //在缓冲区图片的基础上创造画笔 Graphics2D g=buffimmage.createGraphics(); g.setBackground(Color.WHITE); g.setColor(Color.BLACK); g.clearRect(0, 0, width, height); //开始画二维码 /* * 设置二维码信息 */ String str="http://47.93.198.182";//这是一个程序员的表白网页 //把字符串转化为字节数组 byte[] bytes=str.getBytes("utf-8"); if(bytes.length>0){ //用boolean类型的二维数组存放二维码,如果是true则描黑,false则留白。qrcode.calQrcode(bytes);是计算二维码的信息的是方法 boolean[][] bool=qrcode.calQrcode(bytes); //长和宽是一样的 for(int i=0;i<bool.length;i++){ for(int j=0;j<bool[i].length;j++){ if(bool[i][j]==true){ //画小方格 g.fillRect(i*3+pianyiliang, j*3+pianyiliang, 3, 3); } } } } g.dispose(); buffimmage.flush(); //ctrl 1:提示错误的快捷键 try { ImageIO.write(buffimmage, "png", new File("d://a1.png")); } catch (IOException e) { e.printStackTrace(); } } }
注意的事项:
1.二维码的版本号与图片的长和宽是有联系的,这里有一个固定的公式:67+12*(版本号-1);
2.在画小方格的时候,为了纠正二维码在解析时的错误,需要设置一定的额偏移量,g.fillRect(i*3+pianyiliang, j*3+pianyiliang, 3, 3);
3.画完二维码之后,画笔和缓冲区图片都要进行释放。
运行结果: