java 二維碼生成

直接上代碼:java

二維碼生成核心類:apache

package com.bbkj.wechat.tool;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.EnumMap;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggerFactory;


/**
 * 經過google的zxing實現二維碼(加入logo圖片)
 * Created by Administrator on 2017/2/22.
 */
public final class EncodeImgZxing {

    public static Logger logger= Logger.getLogger(EncodeImgZxing.class);
    //二維碼顏色
    private static final int BLACK = 0xFF000000;//0xFFFF0000,紅色
    //二維碼背景色
    private static final int WHITE = 0xFFFFFFFF;//0xFF0000FF,藍色
    //注:二維碼顏色色差大,掃描快,但若是"BLACK'設置爲黑色外其餘顏色,可能沒法掃描
    //二維碼圖片寬度
    private static final int width = 300;
    //二維碼圖片高度
    private static final int height = 300;
    //二維碼格式參數
    private static final EnumMap<EncodeHintType, Object> hints = new EnumMap<EncodeHintType, Object>(EncodeHintType.class);
    static{
        /*二維碼的糾錯級別(排錯率),4個級別:
         L (7%)、
         M (15%)、
         Q (25%)、
         H (30%)(最高H)
         糾錯信息一樣存儲在二維碼中,糾錯級別越高,糾錯信息佔用的空間越多,那麼能存儲的有用訊息就越少;共有四級;
         選擇M,掃描速度快。
         */
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        // 二維碼邊界空白大小 1,2,3,4 (4爲默認,最大)
        hints.put(EncodeHintType.MARGIN, 1);
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        hints.put(EncodeHintType.MAX_SIZE, 350);
        hints.put(EncodeHintType.MIN_SIZE, 150);
    }
    /**
     * 繪製二維碼
     * @param contents 二維碼內容
     * @return image 二維碼圖片
     * */
    public static BufferedImage encodeImg(String contents){
        BufferedImage image = null;
        try{
            BitMatrix matrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height, hints);
            image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            int width = matrix.getWidth();
            int height = matrix.getHeight();
            for(int x = 0; x < width; x++){
                for(int y =0;y < height; y++){
                    image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
                }
            }
        }catch(Exception e){
            logger.error(e.getMessage());
            //System.out.println("生成二維碼失敗"+e.getMessage());
        }
        return image;
    }

    /**
     * 二維碼輸出到文件
     *  @param contents 二維碼內容
     * @param format 圖片格式
     * @param file 輸出文件
     * */
    public static void writeToFile(String contents,String format,File file){
        BufferedImage image = encodeImg(contents);
        try {
            ImageIO.write(image, format, file);
        } catch (IOException e) {
            logger.error(e.getMessage());
            //System.out.println("二維碼寫入文件失敗"+e.getMessage());
        }
    }
    /**
     * 二維碼流式輸出
     *  @param contents 二維碼內容
     * @param format 圖片格式
     * @param stream 輸出流
     * */
    public static void writeToStream(String contents,String format,OutputStream stream){
        BufferedImage image = encodeImg(contents);
        try {
            ImageIO.write(image, format, stream);
        } catch (IOException e) {
            logger.error(e.getMessage());
            //System.out.println("二維碼寫入流失敗"+e.getMessage());
        }
    }
}

使用例子:google

生成二維碼文件:spa

 @Test
    public void testWriteToFile() {
        String contents = "http://blog.csdn.net/typa01_kk";
        String format = "jpeg"; //***此處若是格式爲"gif",則logo圖片爲黑色,其餘格式ok
        String rootUrl = SystemUtil.getProjectClassesPath();
        //生成二維碼
        File logoImg = new File(rootUrl+File.separator+"logo.png");
        File img = new File(rootUrl+File.separator+"csdn.jpg");
        EncodeImgZxing.writeToFile(contents, format, img);
}
相關文章
相關標籤/搜索