zoukankan      html  css  js  c++  java
  • java

    【认识】

     

    【java 实现生成QR code】

    package pers.sun.utils;
    
    import java.awt.BasicStroke;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.Shape;
    import java.awt.geom.RoundRectangle2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    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.DecodeHintType;
    import com.google.zxing.EncodeHintType;
    import com.google.zxing.MultiFormatReader;
    import com.google.zxing.MultiFormatWriter;
    import com.google.zxing.Result;
    import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
    import com.google.zxing.common.BitMatrix;
    import com.google.zxing.common.HybridBinarizer;
    import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
    
    /**
     * 二维码工具类
     * @author 0_o
     *
     */
    public class QRCodeUtil {
    
        //设置编码
        private static final String CHARSET = "utf-8";
        
        //图片格式名
        private static final String FORMAT_NAME = "JPG";
        
        // 二维码尺寸
        private static final int QRCODE_SIZE = 300;
        
        // LOGO宽度
        private static final int WIDTH = 60;
        
        // LOGO高度
        private static final int HEIGHT = 60;
        
        /**
         * 编码:多个重载方法
         */
        //主要的编码方法:两个;
        public static void encode(String content, String imgPath, OutputStream output, boolean needCompress)
                throws Exception {
            BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);
            ImageIO.write(image, FORMAT_NAME, output);
        }
        
        public static void encode(String content, String imgPath, String destPath, boolean needCompress) throws Exception {
            BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);
            mkdirs(destPath);
            // String file = new Random().nextInt(99999999)+".jpg";
            // ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file));
            ImageIO.write(image, FORMAT_NAME, new File(destPath));
        }
        
        //根据不同传参调用不同编码方;
        public static void encode(String content, String destPath) throws Exception {
            QRCodeUtil.encode(content, null, destPath, false);
        }
        
        public static void encode(String content, OutputStream output) throws Exception {
            QRCodeUtil.encode(content, null, output, false);
        }
        
        public static void encode(String content, String imgPath, String destPath) throws Exception {
            QRCodeUtil.encode(content, imgPath, destPath, false);
        }
        
        /**
         * 解码 :多个重载方法
         */
        //
        public static String decode(String path) throws Exception {
            return QRCodeUtil.decode(new File(path));
        }
        
        //主要的解析方法
        public static String decode(File file) throws Exception {
            BufferedImage image;
            image = ImageIO.read(file);
            if (image == null) {
                return null;
            }
            BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
            Result result;
            Hashtable<DecodeHintType, String> hints = new Hashtable<DecodeHintType, String>();
            hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
            result = new MultiFormatReader().decode(bitmap, hints);
            String resultStr = result.getText();
            return resultStr;
        }
    
        
        /**
         * 创建二维码图片
         * @param content
         * @param imgPath
         * @param needCompress
         * @return
         * @throws Exception
         */
        private static BufferedImage createImage(String content, String imgPath, boolean needCompress) throws Exception {
            Hashtable<EncodeHintType, Comparable> hints = new Hashtable<EncodeHintType, Comparable>();
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
            hints.put(EncodeHintType.MARGIN, 1);
            BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,
                    hints);
            int width = bitMatrix.getWidth();
            int height = bitMatrix.getHeight();
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            for (int x = 0; x < width; x++) {
                for (int y = 0; y < height; y++) {
                    image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
                }
            }
            if (imgPath == null || "".equals(imgPath)) {
                return image;
            }
            // 插入图片
            QRCodeUtil.insertImage(image, imgPath, needCompress);
            return image;
        }
    
        /**
         * 二维码图片插入图片(内嵌图片)
         * @param source
         * @param imgPath
         * @param needCompress
         * @throws Exception
         */
        private static void insertImage(BufferedImage source, String imgPath, boolean needCompress) throws Exception {
            File file = new File(imgPath);
            if (!file.exists()) {
                System.err.println("" + imgPath + "   该文件不存在!");
                return;
            }
            Image src = ImageIO.read(new File(imgPath));
            int width = src.getWidth(null);
            int height = src.getHeight(null);
            if (needCompress) { // 压缩LOGO
                if (width > WIDTH) {
                    width = WIDTH;
                }
                if (height > HEIGHT) {
                    height = HEIGHT;
                }
                Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);
                BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
                Graphics g = tag.getGraphics();
                g.drawImage(image, 0, 0, null); // 绘制缩小后的图
                g.dispose();
                src = image;
            }
            // 插入LOGO
            Graphics2D graph = source.createGraphics();
            int x = (QRCODE_SIZE - width) / 2;
            int y = (QRCODE_SIZE - height) / 2;
            graph.drawImage(src, x, y, width, height, null);
            Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
            graph.setStroke(new BasicStroke(3f));
            graph.draw(shape);
            graph.dispose();
        }
    
        
        /**
         * 判断文件是否存在:不存在会创建;
         * @param destPath
         */
        public static void mkdirs(String destPath) {
            File file = new File(destPath);
            // 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
            if (!file.exists() && !file.isDirectory()) {
                file.mkdirs();
            }
        }
    
        
    }

    测试

    package pers.sun.test;
    
    import org.junit.Test;
    
    import pers.sun.utils.QRCodeUtil;
    
    public class QRCodeTest {
    
        /**
         * 测试二维码,编码,解码功能
         */
        @Test
        public void testQRCode() {
            String content="hello world";
            String destPath="./src/main/webapp/img/qrcodes/";//必须为.jpg图片格式,因为在QRCodeUtil中设置的图片格式为JPG
            String imgName=destPath+"qrcode.jpg";
            try {
                QRCodeUtil.encode(content, imgName);
            } catch (Exception e) {
                e.printStackTrace();
            }
            
            String con=null;
            try {
                con = QRCodeUtil.decode(imgName);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("解析内容:"+con);
            
            
            
        }
        
        
    }

     参:https://blog.csdn.net/jam_fanatic/article/details/82818857

  • 相关阅读:
    HDU 5486 Difference of Clustering 图论
    HDU 5481 Desiderium 动态规划
    hdu 5480 Conturbatio 线段树 单点更新,区间查询最小值
    HDU 5478 Can you find it 随机化 数学
    HDU 5477 A Sweet Journey 水题
    HDU 5476 Explore Track of Point 数学平几
    HDU 5475 An easy problem 线段树
    ZOJ 3829 Known Notation 贪心
    ZOJ 3827 Information Entropy 水题
    zoj 3823 Excavator Contest 构造
  • 原文地址:https://www.cnblogs.com/floakss/p/12809006.html
Copyright © 2011-2022 走看看