zoukankan      html  css  js  c++  java
  • 生成二维码工具类及使用

    工具类:

    package com.guoqidangjian.chat.service.service.impl;
    
    import com.google.zxing.BarcodeFormat;
    import com.google.zxing.EncodeHintType;
    import com.google.zxing.MultiFormatWriter;
    import com.google.zxing.WriterException;
    import com.google.zxing.common.BitMatrix;
    import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
    import com.guoqidangjian.chat.contract.service.QRcodeService;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.stereotype.Service;
    
    import javax.imageio.ImageIO;
    import java.awt.*;
    import java.awt.geom.AffineTransform;
    import java.awt.image.AffineTransformOp;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * Created by SunZhenYang on 2015/10/16.
     */
    @Service("qRcodeService")
    public class QRcodeServiceImpl implements QRcodeService {
        // 图片宽度的一般
        private static final int IMAGE_WIDTH = 80;
        private static final int IMAGE_HEIGHT = 80;
        private static final int IMAGE_HALF_WIDTH = IMAGE_WIDTH / 2;
        private static final int FRAME_WIDTH = 2;
    
        // 二维码写码器
        private static MultiFormatWriter mutiWriter = new MultiFormatWriter();
    
        @Override
        public String getQRcodeUrl(String content,int width, int height, String srcImagePath, String destImagePath) {
            return encode( content, width,  height,  srcImagePath,  destImagePath);
        }
    
        private String encode(String content, int width, int height, String srcImagePath, String destImagePath) {
            try {
                if(!StringUtils.isBlank(srcImagePath)){
                    ImageIO.write(genBarcode(content, width, height, srcImagePath), "jpg", new File(destImagePath));
                }else{
                    ImageIO.write(genBarcode(content, width, height), "jpg", new File(destImagePath));
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (WriterException e) {
                e.printStackTrace();
            }
            return destImagePath;
        }
    
        private static BufferedImage genBarcode(String content, int width, int height, String srcImagePath) throws WriterException,
                IOException {
            // 读取源图像
            BufferedImage scaleImage = scale(srcImagePath, IMAGE_WIDTH,
                    IMAGE_HEIGHT, true);
            int[][] srcPixels = new int[IMAGE_WIDTH][IMAGE_HEIGHT];
            for (int i = 0; i < scaleImage.getWidth(); i++) {
                for (int j = 0; j < scaleImage.getHeight(); j++) {
                    srcPixels[i][j] = scaleImage.getRGB(i, j);
                }
            }
    
            Map<EncodeHintType, Object> hint = new HashMap<EncodeHintType, Object>();
            hint.put(EncodeHintType.CHARACTER_SET, "utf-8");
            hint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            // 生成二维码
            BitMatrix matrix = mutiWriter.encode(content, BarcodeFormat.QR_CODE,
                    width, height, hint);
    
            // 二维矩阵转为一维像素数组
            int halfW = matrix.getWidth() / 2;
            int halfH = matrix.getHeight() / 2;
            int[] pixels = new int[width * height];
    
            for (int y = 0; y < matrix.getHeight(); y++) {
                for (int x = 0; x < matrix.getWidth(); x++) {
                    // 读取图片
                    if (x > halfW - IMAGE_HALF_WIDTH
                            && x < halfW + IMAGE_HALF_WIDTH
                            && y > halfH - IMAGE_HALF_WIDTH
                            && y < halfH + IMAGE_HALF_WIDTH) {
    //                    pixels[y * width + x] = srcPixels[x - halfW
    //                            + IMAGE_HALF_WIDTH][y - halfH + IMAGE_HALF_WIDTH];
                    }
                    // 在图片四周形成边框
                    else if ((x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH
                            && x < halfW - IMAGE_HALF_WIDTH + FRAME_WIDTH
                            && y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH
                            + IMAGE_HALF_WIDTH + FRAME_WIDTH)
                            || (x > halfW + IMAGE_HALF_WIDTH - FRAME_WIDTH
                            && x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH
                            && y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH
                            + IMAGE_HALF_WIDTH + FRAME_WIDTH)
                            || (x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH
                            && x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH
                            && y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH
                            - IMAGE_HALF_WIDTH + FRAME_WIDTH)
                            || (x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH
                            && x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH
                            && y > halfH + IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH
                            + IMAGE_HALF_WIDTH + FRAME_WIDTH)) {
                        pixels[y * width + x] = 0xfffffff;
                    } else {
                        // 此处可以修改二维码的颜色,可以分别制定二维码和背景的颜色;
                        pixels[y * width + x] = matrix.get(x, y) ? 0xff000000
                                : 0xfffffff;
                    }
                }
            }
    
            BufferedImage image = new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_RGB);
            image.getRaster().setDataElements(0, 0, width, height, pixels);
    
            return image;
        }
        private static BufferedImage genBarcode(String content, int width, int height) throws WriterException,
                IOException {
    
    
            Map<EncodeHintType, Object> hint = new HashMap<EncodeHintType, Object>();
            hint.put(EncodeHintType.CHARACTER_SET, "utf-8");
            hint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            // 生成二维码
            BitMatrix matrix = mutiWriter.encode(content, BarcodeFormat.QR_CODE,
                    width, height, hint);
    
            // 二维矩阵转为一维像素数组
            int halfW = matrix.getWidth() / 2;
            int halfH = matrix.getHeight() / 2;
            int[] pixels = new int[width * height];
    
            for (int y = 0; y < matrix.getHeight(); y++) {
                for (int x = 0; x < matrix.getWidth(); x++) {
                    // 此处可以修改二维码的颜色,可以分别制定二维码和背景的颜色;
                    pixels[y * width + x] = matrix.get(x, y) ? 0xff000000 : 0xfffffff;
                }
            }
    
            BufferedImage image = new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_RGB);
            image.getRaster().setDataElements(0, 0, width, height, pixels);
    
            return image;
        }
        /**
         * 把传入的原始图像按高度和宽度进行缩放,生成符合要求的图标
         *
         * @param srcImageFile
         *            源文件地址
         * @param height
         *            目标高度
         * @param width
         *            目标宽度
         * @param hasFiller
         *            比例不对时是否需要补白:true为补白; false为不补白;
         * @throws IOException
         */
        private static BufferedImage scale(String srcImageFile, int height,
                                           int width, boolean hasFiller) throws IOException {
            double ratio = 0.0; // 缩放比例
            File file = new File(srcImageFile);
            BufferedImage srcImage = ImageIO.read(file);
            Image destImage = srcImage.getScaledInstance(width, height,
                    BufferedImage.SCALE_SMOOTH);
            // 计算比例
            if ((srcImage.getHeight() > height) || (srcImage.getWidth() > width)) {
                if (srcImage.getHeight() > srcImage.getWidth()) {
                    ratio = (new Integer(height)).doubleValue()
                            / srcImage.getHeight();
                } else {
                    ratio = (new Integer(width)).doubleValue()
                            / srcImage.getWidth();
                }
                AffineTransformOp op = new AffineTransformOp(
                        AffineTransform.getScaleInstance(ratio, ratio), null);
                destImage = op.filter(srcImage, null);
            }
            if (hasFiller) {// 补白
                BufferedImage image = new BufferedImage(width, height,
                        BufferedImage.TYPE_INT_RGB);
                Graphics2D graphic = image.createGraphics();
                graphic.setColor(Color.white);
                graphic.fillRect(0, 0, width, height);
                if (width == destImage.getWidth(null))
                    graphic.drawImage(destImage, 0,
                            (height - destImage.getHeight(null)) / 2,
                            destImage.getWidth(null), destImage.getHeight(null),
                            Color.white, null);
                else
                    graphic.drawImage(destImage,
                            (width - destImage.getWidth(null)) / 2, 0,
                            destImage.getWidth(null), destImage.getHeight(null),
                            Color.white, null);
                graphic.dispose();
                destImage = image;
            }
            return (BufferedImage) destImage;
        }
    }


     

    调用接口:

    package com.guoqidangjian.chat.contract.service;
    
    /**
     * Created by SunZhenYang on 2015/10/16.
     */
    public interface QRcodeService {
    
        /**
         * 获取二维码图片,支持生成二维码中加入图片
         *
         * @param content       二维码中包含的内容
         * @param width         图片的宽度
         * @param height          图片高度
         * @param srcImagePath 需要插入的图片地址,没有可以为空
         * @param destImagePath 生成的二维码路径
         * @return
         */
    
        String getQRcodeUrl(String content,int width, int height, String srcImagePath, String destImagePath);
    }


    controller 调用方法代码:

           /**
            * 生成二维码
            * @param id
            * @param title
            * @param content
            * @param meetDate 会议时间
            * @param request
            * @param model
            * @return
            */
           @RequestMapping(value="/threeLesson/getQRcodeurl",method=RequestMethod.GET)
           public String getQRcodeurl(String id,String meetDate,HttpServletRequest request,HttpServletResponse response, ModelMap model) throws UnsupportedEncodingException{    
              request.setCharacterEncoding("gb2312"); 
              response.setContentType("text/html;charset=utf-8");          
              String title = request.getParameter("title");
              
              title= new String(request.getParameter("title").getBytes("ISO-8859-1"),"utf-8");
              
              String qRcontent="{\"id\" : "+id+", \"title\" : "+title+", \"meetDate\" : "+meetDate+"}";
              //简单的时间戳
              Date date = new Date();
              SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
              String str = sdf.format(date);
              
              String temporaryPath= System.getProperty("java.io.tmpdir"); 
              temporaryPath=temporaryPath+str;
              String qRcodeUrl=qRcodeService.getQRcodeUrl(qRcontent,300, 300, "", temporaryPath);          
              model.addAttribute("qRcodeUrl",qRcodeUrl);
              return "threeLesson/RQcode";
           }
  • 相关阅读:
    Java异常的优势与缺陷,及其处理原则
    Kettle 4.2源码分析第四讲--KettleJob机制与Database插件简介(含讲解PPT)
    Kettle 4.2源码分析第三讲--Kettle 转换机制transformation介绍
    Kettle 4.2源码分析第二讲--Kettle插件结构体系简介
    Kettle 4.2源码分析第一讲--Kettle 简介
    pytorch one hot 的转换
    SQLSERVER类似于lastindexof的语句
    自定义省市选择器 微信小程序多列选择器
    王者荣耀伽罗壁纸
    微信小程序实现淡入淡出效果(页面跳转)
  • 原文地址:https://www.cnblogs.com/sunhaoyu/p/4885769.html
Copyright © 2011-2022 走看看