1. 程式人生 > >java二維碼生成-谷歌(Google.zxing)開源二維碼生成的例項及介紹

java二維碼生成-谷歌(Google.zxing)開源二維碼生成的例項及介紹

需要的maven依賴:

  •         <properties>
    		<com.google.zxing.version>3.3.0</com.google.zxing.version>
    	    </properties>
            <dependency>
    			<groupId>com.google.zxing</groupId>
    			<artifactId>core</artifactId>
    			<version>${com.google.zxing.version}</version>
    		</dependency>
    		<dependency>
    			<groupId>com.google.zxing</groupId>
    			<artifactId>javase</artifactId>
    			<version>${com.google.zxing.version}</version>
    		</dependency>

這裡我們使用位元矩陣(位矩陣)的QR碼編碼在緩衝圖片上畫出二維碼

  例項有以下一個傳入引數

      OutputStream outputStream, 要儲存的檔案

      String content, 攜帶資訊的內容

      int qrCodeSize, 圖片大小

      String imageFormat 編碼

  步驟:

  1.設定二維碼的糾錯級別引數

 //設定二維碼糾錯級別MAP
       Hashtable<EncodeHintType, ErrorCorrectionLevel> hintMap = new Hashtable<EncodeHintType, ErrorCorrectionLevel>(); 
       hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L); // 矯錯級別

2.建立位元矩陣

1 QRCodeWriter qrCodeWriter = new QRCodeWriter(); 
2 //建立位元矩陣(位矩陣)的QR碼編碼的字串 
3 BitMatrix byteMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, qrCodeSize, qrCodeSize, hintMap); 
4 // 使BufferedImage勾畫QRCode (matrixWidth 是行二維碼畫素點)
5 int matrixWidth = byteMatrix.getWidth();

  3.開始在緩衝圖片中畫二維碼

BufferedImage image = new BufferedImage(matrixWidth, matrixWidth, BufferedImage.TYPE_INT_RGB);  
            image.createGraphics();  
            Graphics2D graphics = (Graphics2D) image.getGraphics();  
            graphics.setColor(Color.WHITE);  
            graphics.fillRect(0, 0, matrixWidth, matrixWidth);  
            // 使用位元矩陣畫並儲存影象
            graphics.setColor(Color.BLACK);  
            for (int i = 0; i < matrixWidth; i++){
                for (int j = 0; j < matrixWidth; j++){
                    if (byteMatrix.get(i, j)){
                        graphics.fillRect(i, j, 1, 1);  
                    }
                }
            }
            ImageIO.write(image, imageFormat, outputStream);

 二維碼生成的工具類程式碼;

package 。。。;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Hashtable;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.EncodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.ReaderException;
import com.google.zxing.Result;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

/**
 * 二維碼生成和讀的工具類
 *
 */
public class QrCodeCreateUtil {
    
    /**
     * 生成包含字串資訊的二維碼圖片
     * @param outputStream 檔案輸出流路徑
     * @param content 二維碼攜帶資訊
     * @param qrCodeSize 二維碼圖片大小
     * @param imageFormat 二維碼的格式
     * @throws WriterException 
     * @throws IOException 
     */
    public static boolean createQrCode(OutputStream outputStream, String content, int qrCodeSize, String imageFormat) throws WriterException, IOException{  
            //設定二維碼糾錯級別MAP
            Hashtable<EncodeHintType, ErrorCorrectionLevel> hintMap = new Hashtable<EncodeHintType, ErrorCorrectionLevel>();  
            hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);  // 矯錯級別  
            QRCodeWriter qrCodeWriter = new QRCodeWriter();  
            //建立位元矩陣(位矩陣)的QR碼編碼的字串  
            BitMatrix byteMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, qrCodeSize, qrCodeSize, hintMap);  
            // 使BufferedImage勾畫QRCode  (matrixWidth 是行二維碼畫素點)
            int matrixWidth = byteMatrix.getWidth();  
            BufferedImage image = new BufferedImage(matrixWidth-200, matrixWidth-200, BufferedImage.TYPE_INT_RGB);  
            image.createGraphics();  
            Graphics2D graphics = (Graphics2D) image.getGraphics();  
            graphics.setColor(Color.WHITE);  
            graphics.fillRect(0, 0, matrixWidth, matrixWidth);  
            // 使用位元矩陣畫並儲存影象
            graphics.setColor(Color.BLACK);  
            for (int i = 0; i < matrixWidth; i++){
                for (int j = 0; j < matrixWidth; j++){
                    if (byteMatrix.get(i, j)){
                        graphics.fillRect(i-100, j-100, 1, 1);  
                    }
                }
            }
            return ImageIO.write(image, imageFormat, outputStream);  
    }  
      
    /**
     * 讀二維碼並輸出攜帶的資訊
     */
    public static void readQrCode(InputStream inputStream) throws IOException{  
        //從輸入流中獲取字串資訊
        BufferedImage image = ImageIO.read(inputStream);  
        //將影象轉換為二進位制點陣圖源
        LuminanceSource source = new BufferedImageLuminanceSource(image);  
        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));  
        QRCodeReader reader = new QRCodeReader();  
        Result result = null ;  
        try {
         result = reader.decode(bitmap);  
        } catch (ReaderException e) {
            e.printStackTrace();  
        }
        System.out.println(result.getText());  
    }
    /**
     * 測試程式碼
     * @throws WriterException 
     */
    public static void main(String[] args) throws IOException, WriterException {  
        
        createQrCode(new FileOutputStream(new File("d:\\qrcode.jpg")),"WE1231238239128sASDASDSADSDWEWWREWRERWSDFDFSDSDF123123123123213123",900,"JPEG");
        readQrCode(new FileInputStream(new File("d:\\qrcode.jpg")));  
    }  
  
}

轉載自:https://www.cnblogs.com/lanxiamo/p/6293580.html