二维码的生成方式(java)

来源:互联网 发布:量化交易算法 编辑:程序博客网 时间:2024/05/29 16:31

  介绍三种二维码的生成方式:

  第一种:使用google的zxing生成

package com.zxing;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.nio.file.FileSystems;import java.nio.file.Path;import java.util.HashMap;import java.util.Map;import javax.imageio.ImageIO;import com.google.zxing.BarcodeFormat;import com.google.zxing.Binarizer;import com.google.zxing.BinaryBitmap;import com.google.zxing.DecodeHintType;import com.google.zxing.EncodeHintType;import com.google.zxing.LuminanceSource;import com.google.zxing.MultiFormatReader;import com.google.zxing.MultiFormatWriter;import com.google.zxing.NotFoundException;import com.google.zxing.Result;import com.google.zxing.WriterException;import com.google.zxing.client.j2se.BufferedImageLuminanceSource;import com.google.zxing.client.j2se.MatrixToImageWriter;import com.google.zxing.common.BitMatrix;import com.google.zxing.common.HybridBinarizer;public class TestZXing {public static void main(String[] args) throws Exception {// testEncode();testDecode();}/** * 生成二维码 *  * @throws WriterException * @throws IOException */public static void testEncode() throws WriterException, IOException {String filePath = "D://";String fileName = "zxing.png";String content = "测试zxing生成二维码";int width = 300; // 图像宽度int height = 300; // 图像高度String format = "png";// 图像类型Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");BitMatrix bitMatrix = new MultiFormatWriter().encode(content,BarcodeFormat.QR_CODE, width, height, hints);// 生成矩阵Path path = FileSystems.getDefault().getPath(filePath, fileName);MatrixToImageWriter.writeToPath(bitMatrix, format, path);// 输出图像System.out.println("输出成功.");}/** * 解析二维码 */public static void testDecode() {String filePath = "D://zxing.png";BufferedImage image;try {image = ImageIO.read(new File(filePath));LuminanceSource source = new BufferedImageLuminanceSource(image);Binarizer binarizer = new HybridBinarizer(source);BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>();hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");Result result = new MultiFormatReader().decode(binaryBitmap, hints);// 对图像进行解码System.out.println("图片中内容:  ");System.out.println("author: " + result.getText());System.out.println("图片中格式:  ");System.out.println("encode: " + result.getBarcodeFormat());} catch (IOException e) {e.printStackTrace();} catch (NotFoundException e) {e.printStackTrace();}}}

第二种方式:使用qrCode方式

package com.qrCode;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 com.swetake.util.Qrcode;import jp.sourceforge.qrcode.QRCodeDecoder;import jp.sourceforge.qrcode.exception.DecodingFailedException;public class QRCode {/** * 解析二维码(QRCode) *  * @param imgPath * @return */public static 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 QRCodeImageBean(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 content  存储内容 * @param imgPath 图片路径 * @param imgType  图片类型 */public static void encoderQRCode(String content, String imgPath, String imgType) {encoderQRCode(content, imgPath, imgType, 7);}/** * 生成二维码(QRCode)图片 *  * @param content   存储内容 * @param imgPath  图片路径 * @param imgType 图片类型 * @param size 二维码尺寸 */public static void encoderQRCode(String content, String imgPath, String imgType, int size) {try {BufferedImage bufImg = qRCodeCommon(content, imgType, size);File imgFile = new File(imgPath);// 生成二维码QRCode图片ImageIO.write(bufImg, imgType, imgFile);} catch (Exception e) {e.printStackTrace();}}/** * 生成二维码(QRCode)图片的公共方法 *  * @param content  存储内容 * @param imgType 图片类型 * @param size 二维码尺寸(1-40) * @return */private static 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);// 设定图像颜色> BLACKgs.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 {throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800].");}gs.dispose();bufImg.flush();} catch (Exception e) {e.printStackTrace();}return bufImg;}}
package com.qrCode;import java.awt.image.BufferedImage;import jp.sourceforge.qrcode.data.QRCodeImage;public class QRCodeImageBean implements QRCodeImage {    BufferedImage bufImg;          public QRCodeImageBean(BufferedImage bufImg) {          this.bufImg = bufImg;      }      public int getHeight() {          return bufImg.getHeight();      }      public int getPixel(int x, int y) {          return bufImg.getRGB(x, y);      }      public int getWidth() {          return bufImg.getWidth();      }  }

package com.qrCode;public class TestQRCode {public static void main(String[] args) { //生成二维码 String imgPath = "d:/qrCode.png"; String encoderContent = "http://www.qrCode.com"; QRCode.encoderQRCode(encoderContent, imgPath, "png"); System.out.println("encoder success!!!");  //解析二维码 String imgPath2 = "d:/qrCode.png"; String qrCon = QRCode.decoderQRCode(imgPath2); System.out.println("decoder success!!!"); System.out.println("二维码内容为:" + qrCon);}}

第三种方式:这也是最简单的方式使用jQuery的qrCode插件

<!DOCTYPE html><html><head><meta charset="UTF-8"><title>使用JQueryQrCode生成二维码</title><script type="text/javascript" src="./js/jquery-1.9.1.min.js"></script><script type="text/javascript" src="./js/qrcode.js"></script></head><body><div id="qrcode"></div><script type="text/javascript">//参数1表示图像大小,取值范围1-10;参数2表示质量,取值范围'L','M','Q','H'var content = "使用JQueryQrCode生成二维码"var qr = qrcode(8, 'M');qr.addData(content);qr.make();/* var dom=document.createElement('DIV');dom.innerHTML = qr.createImgTag();var element=document.getElementById("qrcode");element.appendChild(dom); */$("#qrcode").html(qr.createImgTag());  </script></body></html>

资源可以在这里下载:http://download.csdn.net/detail/qq_21916331/9594641



0 0
原创粉丝点击