【java】二维码的生成和使用

来源:互联网 发布:域名公安局备案 编辑:程序博客网 时间:2024/06/07 07:16

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);



















1 0
原创粉丝点击