生成二维码主要有三种技术:ZXing,qrcode和jQuery.qrcode。这里使用ZXing生成二维码。直接上代码吧:
package com.wjl.test; import java.awt.BasicStroke; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.util.HashMap; import javax.imageio.ImageIO; import com.google.zxing.BarcodeFormat; import com.google.zxing.BinaryBitmap; import com.google.zxing.DecodeHintType; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatReader; import com.google.zxing.MultiFormatWriter; import com.google.zxing.Result; import com.google.zxing.common.BitMatrix; import com.google.zxing.common.HybridBinarizer; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import com.tzj.tsp.qrcode.BufferedImageLuminanceSource; import com.tzj.tsp.qrcode.MatrixToImageWriter; public class CreateQRCodeInZXing { /** * 该类用来生成二维码 */ public static void main(String[] args) { //1、定义二维码的大小、图片后缀名和内容 int width = 300; int height = 300; //png比jpg的两个优点:1、png支持透明 2、png较小 String format = "png"; String contents = "使用ZXing生成二维码"; System.out.println("生成二维码内容:"+contents); //2、定义二维码文件 String filePath = "D:"+File.separator+"temp"+File.separator+"ZXing"+System.currentTimeMillis()+"."+format; File QRFile = new File(filePath); //3、生成二维码 CreateQRCodeInZXing zXing = new CreateQRCodeInZXing(); boolean flag = zXing.createQRCode(contents,width,height,QRFile); if(flag){//说明生成二维码成功 //4、添加logo String logoPath = "D:"+File.separator+"temp"+File.separator+"logo.jpg"; File logoFile = new File(logoPath); int resu = zXing.addLogoQRCode(QRFile, logoFile, format,2); if(resu==3){//添加logo成功 //5、解析二维码 String result = zXing.readQRCode(QRFile); System.out.println("解析二维码内容:"+result); } } } /** * 该方法用来生成二维码 * @param contents:二维码内容 * @param width:二维码宽度 * @param height:二维码高度 * @param format:二维码图片后缀名 * @param QRFile:二维码图片文件 * @return boolean:true-生成成功 false-生成失败 * */ public boolean createQRCode(String contents,int width,int height,File QRFile){ boolean result = false; try{ //生成矩阵 BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height,getEncodeHints()); MatrixToImageWriter.writeToFile(bitMatrix,QRFile); result = true; }catch(Exception e){ e.printStackTrace(); } return result; } /** * 该方法用来读取二维码内容 * @param QRFile:二维码图片文件 * @return String:二维码内容 * **/ public String readQRCode(File QRFile){ if(!QRFile.exists() || !QRFile.isFile()) return ""; String result=""; try{ MultiFormatReader formatReader = new MultiFormatReader(); //读取文件并识别成图片 BufferedImage image = ImageIO.read(QRFile); BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image))); Result result2 = formatReader.decode(binaryBitmap,getDecodeHints()); result = result2.getText(); }catch(Exception e){ e.printStackTrace(); } return result; } /** * 给二维码图片添加Logo * @param QRFile:二维码图片文件 * @param logoFile:logo文件对象 * @param format:添加logo后的二维码文件后缀名 * @param logoConfig:logo设置 * @param postion:1-右下角 非1-中间 * @return int:1-找不到二维码文件或logo文件 2-生成成抛出异常 3-生成成功 */ public int addLogoQRCode(File QRFile,File logoFile,String format,int position) { int result = 3; try { //二维码文件或logo文件不存在或不是文件 if (!QRFile.exists() || !QRFile.isFile() || !logoFile.exists() || !logoFile.isFile()) { return 1; } //读取二维码图片,并构建绘图对象 BufferedImage image = ImageIO.read(QRFile); Graphics2D g = image.createGraphics(); //读取Logo图片 BufferedImage logo = ImageIO.read(logoFile); //设置logo的大小,此处设置为二维码图片的20%,因为过大会盖掉二维码 int widthLogo = logo.getWidth(null) > image.getWidth() * 2 / 10 ? (image .getWidth() * 2 / 10) : logo.getWidth(null), heightLogo = logo .getHeight(null) > image.getHeight() * 2 / 10 ? (image .getHeight() * 2 / 10) : logo.getWidth(null); // 计算图片放置位置 int x=0,y=0; if(position==1){//logo放在右下角 x = (image.getWidth() - widthLogo); y = (image.getHeight() - heightLogo); }else{//logo放在中心 x = (image.getWidth() - widthLogo) / 2; y =(image.getHeight() - heightLogo) / 2; } // 开始绘制图片 g.drawImage(logo, x, y, widthLogo, heightLogo, null); g.drawRoundRect(x, y, widthLogo, heightLogo, 15, 15); g.setStroke(new BasicStroke(2)); g.drawRect(x, y, widthLogo, heightLogo); g.dispose(); logo.flush(); image.flush(); ImageIO.write(image,format,QRFile); } catch (Exception e) { result = 2; e.printStackTrace(); } return result; } /** * 该方法用来生成二维码时设置二维码的编码、纠错等级等参数 * */ public HashMap getEncodeHints(){ HashMap hints = new HashMap(); hints.put(EncodeHintType.CHARACTER_SET,"UTF-8");//设置编码 //二维码的容错等级(纠错能力)分四种: //L:约可纠错7%的数据 M:约可纠错15%的数据 Q:约可纠错25%的数据 H:约可纠错30%的数据 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);//设置容错等级(纠错能力) hints.put(EncodeHintType.MARGIN,2);//边距(即二维码结构图中的空白区) return hints; } /** * 该方法用来解析二维码时设置二维码的编码等参数 * */ public HashMap getDecodeHints(){ HashMap hints = new HashMap(); hints.put(DecodeHintType.CHARACTER_SET,"UTF-8");//设置编码 return hints; } }
需要的jar包:core-2.2.jar