前两天工做须要上网查了一下JAVA生成二维码程序的方法,试了几种都全报一此小BUG,而且在二维码中添加LOGO的会没法解析,后来调整一下生成的信息量,便能正常生成了,二维生成的原理相似于针孔打印机原理。下面上代码:html
说明:须要用到jar工具包为QRCode.jar java
类1:数组
package com.tyzs.util; import java.awt.image.BufferedImage; import jp.sourceforge.qrcode.data.QRCodeImage; public class TwoDimensionCodeImage implements QRCodeImage { BufferedImage bufImg; public TwoDimensionCodeImage(BufferedImagebufImg) { this.bufImg = bufImg; } public int getHeight() { returnbufImg.getHeight(); } public int getPixel(int x, int y) { return bufImg.getRGB(x,y); } public int getWidth() { return bufImg.getWidth(); } }
类2:工具
package com.tyzs.util; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import jp.sourceforge.qrcode.QRCodeDecoder; import jp.sourceforge.qrcode.exception.DecodingFailedException; import com.swetake.util.Qrcode; public class TwoDimensionCode { public void encoderQRCode(String content, StringimgType, int size, StringimagePath) { BufferedImage bufImg =null; try { QrcodeqrcodeHandler = 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 = newBufferedImage(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 <800) { 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{ thrownew Exception("QRCode content bytes length = " +contentBytes.length + " not in [0, 800]."); } //LOGO gs.dispose(); bufImg.flush(); } catch (Exception e) { e.printStackTrace(); } // 生成二维码QRCode图片 try { File imgFile= new File(imagePath); ImageIO.write(bufImg,imgType, imgFile); } catch (IOException e) { // TODOAuto-generated catch block e.printStackTrace(); } } public String decoderQRCode(String imgPath){ // QRCode 二维码图片的文件 File imageFile = newFile(imgPath); BufferedImage bufImg =null; String content = null; try { bufImg =ImageIO.read(imageFile); QRCodeDecoderdecoder = new QRCodeDecoder(); content = newString(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:测试类测试
package com.tyzs.test; import com.tyzs.util.TwoDimensionCode; public class Test { public static void main(String[] args) { String imgPath ="F:/test.png"; String encoderContent ="http://www.weibo.com/tuanyaozhishang"; TwoDimensionCode handler = newTwoDimensionCode(); handler.encoderQRCode(encoderContent,"png", 20, imgPath); // 内容 图片路径 // 图片格式 大小 System.out.println("========encodersuccess"); String decoderContent =handler.decoderQRCode(imgPath); // 图片路径 System.out.println("解析结果以下:"); System.out.println(decoderContent); System.out.println("========decodersuccess!!!"); } }
效果图以下:this
后记:关于jar能够去网上下载,也能够给我留言索要,这里logo的路径我写死了,你也能够在生成方法中添加一个logo的路径参数,方便调用。 技术路很长,努力积累即是海洋! 抟摇直上 2013-08-12编码
转载说明:http://blog.sina.com.cn/s/blog_918966b40101budt.htmlurl