【java】二維碼的生成和使用


maven 依賴:

使用google的zxing包

<dependency>
     <groupId>com.google.zxing</groupId>
     <artifactId>core</artifactId>
     <version>3.2.0</version>
</dependency> 
<dependency>
     <groupId>com.google.zxing</groupId>
     <artifactId>javase</artifactId>
     <version>3.2.0</version>
</dependency>




工具類代碼:


package com.kaiyuan.kp.kyshop.app.twoDimensionCode;

import java.awt.BasicStroke;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
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.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
/**
 *
 *二維碼生成工具類(ZXing)
 */
public class TwoDimensionCodeUtil {
    /**
     * 生成二維碼(ZXing)圖片 ,編碼默認UTF-8
     * @param content 二維碼內容
     * @param path 文件存儲路徑,不包括文件名稱
     * @param fileName 文件名稱,不加後綴
     * @param imageType 圖片類型
     * @param width 寬度
     * @param height 高度
     */
    public static void encoderTwoDimensionCodeToFile(String content,String path,String fileName,String imageType,int width,int height){
    MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
    Map<EncodeHintType,String> hints = new HashMap<EncodeHintType,String>();
    hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
    try {
     BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, width, height,hints);
     Path filepath = new File(path+fileName+"."+imageType).toPath();
     MatrixToImageWriter.writeToPath(bitMatrix, imageType, filepath);
    } catch (Exception e){
     e.printStackTrace();
    }
    }
    /**
     * 將二維碼輸出到流,編碼默認UTF-8
     * @param content 二維碼內容
     * @param imageType 圖片類型
     * @param width 寬度
     * @param height 高度
     * @param out 輸出流
     */
    public static void encoderTwoDimensionCodeToStream(String content,String imageType,int width,int height,OutputStream out){
     MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
     Map<EncodeHintType,String> hints = new HashMap<EncodeHintType,String>();
     hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
     try {
      BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, width, height,hints);
      MatrixToImageWriter.writeToStream(bitMatrix, imageType, out);
     } catch (Exception e) {
      e.printStackTrace();
     }
    }
    /**
     * 生成帶logo的二維碼圖片流
     * @param content
     * @param imageType
     * @param width
     * @param height
     * @param out
     */
    public static void encoderLogoTwoDimensionCodeToStream(String content,String imageType,int width,int height,OutputStream out){
     MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
     Map<EncodeHintType,String> hints = new HashMap<EncodeHintType,String>();
     hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
     ByteArrayOutputStream o1 =new ByteArrayOutputStream();
     try {
      BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, width, height,hints);
      MatrixToImageWriter.writeToStream(bitMatrix, imageType, o1);
     } catch (Exception e) {
      e.printStackTrace();
     }
     ByteArrayInputStream in = new ByteArrayInputStream(o1.toByteArray());
     encoderLogoTwoDimensionCodeToStream( in, new File("d:/logo.jpg"), imageType, new LogoConfig(), out);
    }
   
    public static void encoderLogoTwoDimensionCodeToStream(InputStream in, File logoPic,String imageType, LogoConfig logoConfig,OutputStream out)
    {
        try
        {
            /**
             * 讀取二維碼圖片,並構建繪圖對象
             */
            BufferedImage image = ImageIO.read(in);
            Graphics2D g = image.createGraphics();
 
            /**
             * 讀取Logo圖片
             */
            BufferedImage logo = ImageIO.read(logoPic);
             
            int widthLogo = logo.getWidth(), heightLogo = logo.getHeight();
             
            // 計算圖片放置位置
            int x = (image.getWidth() - widthLogo) / 2;
            int y = (image.getHeight() - logo.getHeight()) / 2;
 
            //開始繪製圖片
            g.drawImage(logo, x, y, widthLogo, heightLogo, null);
            g.drawRoundRect(x, y, widthLogo, heightLogo, 15, 15);
            g.setStroke(new BasicStroke(logoConfig.getBorder()));
            g.setColor(logoConfig.getBorderColor());
            g.drawRect(x, y, widthLogo, heightLogo);
             
            g.dispose();
             
            ImageIO.write(image, imageType, out);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
   
}  



使用方式:

        String content = httpRequest.getParameter("content");                         //二維碼映射的實際Url
        String imageType = httpRequest.getParameter("imageType");              //圖片類型
        int width = Integer.parseInt(httpRequest.getParameter("width"));         //二維碼寬
        int height = Integer.parseInt(httpRequest.getParameter("height"));      //二維碼高

        if (Strings.isNullOrEmpty(content)) {
            LOGGER.warn("The content is null or empty");
            return (T) new Result(StatusCodes.BAD_REQUEST, false);
        }

        httpResponse.setContentType("image/jpg");
   
        try {
            TwoDimensionCodeUtil.encoderTwoDimensionCodeToStream(content, imageType, width, height,
                    httpResponse.getOutputStream());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



頁面使用返回的流:

html:
<img id="Img" src="" />
js:
var src = encodeURI("/twoDimensionCode/erweima?content=www.baidu.com&imageType=jpg&width=25&height=25");
$("#Img").attr("src",src);



















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章