美文网首页JAVA
JAVA实现二维码制作和读取

JAVA实现二维码制作和读取

作者: WebGiser | 来源:发表于2018-04-19 17:31 被阅读9次

    项目结构:


    image.png

    pom.xml代码:

        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>com.google.zxing</groupId>
                <artifactId>core</artifactId>
                <version>3.3.0</version>
            </dependency>
    
            <dependency>
                <groupId>com.google.zxing</groupId>
                <artifactId>javase</artifactId>
                <version>3.3.0</version>
            </dependency>
        </dependencies>
    

    二维码制作和解析:

    import com.google.zxing.*;
    import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
    import com.google.zxing.common.BitMatrix;
    import com.google.zxing.common.HybridBinarizer;
    import javax.imageio.ImageIO;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    
    public class ZxingCode {
        //二维码颜色
        private static final int BLACK = 0xFF000000;
        //二维码颜色
        private static final int WHITE = 0xFFFFFFFF;
    
        /**
         * ZXing方式生成二维码
         * @param text    二维码内容
         * @param width    二维码宽
         * @param height    二维码高
         * @param outPutPath    二维码生成保存路径
         * @param imageType        二维码生成格式
         */
        public void zxingCodeCreate(String text, int width, int height, String outPutPath, String imageType) {
            Map<EncodeHintType, String> his = new HashMap<EncodeHintType, String>();
            //设置编码字符集
            his.put(EncodeHintType.CHARACTER_SET, "utf-8");
            try {
                //1、生成二维码
                BitMatrix encode = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, his);
    
                //2、获取二维码宽高
                int codeWidth = encode.getWidth();
                int codeHeight = encode.getHeight();
    
                //3、将二维码放入缓冲流
                BufferedImage image = new BufferedImage(codeWidth, codeHeight, BufferedImage.TYPE_INT_RGB);
                for (int i = 0; i < codeWidth; i++) {
                    for (int j = 0; j < codeHeight; j++) {
                        //4、循环将二维码内容定入图片
                        image.setRGB(i, j, encode.get(i, j) ? BLACK : WHITE);
                    }
                }
                File outPutImage = new File(outPutPath);
                //如果图片不存在创建图片
                if(!outPutImage.exists()){
                    outPutImage.createNewFile();
                }
    
                //5、将二维码写入图片
                ImageIO.write(image, imageType, outPutImage);
    
            } catch (WriterException e) {
                e.printStackTrace();
                System.out.println("二维码生成失败");
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("生成二维码图片失败");
            }
        }
    
        /**
         * 二维码解析
         * @param analyzePath    二维码路径
         * @return
         * @throws IOException
         */
        public Object zxingCodeAnalyze(String analyzePath) throws Exception{
            MultiFormatReader formatReader = new MultiFormatReader();
            Object result = null;
            try {
                File file = new File(analyzePath);
                if (!file.exists())
                {
                    return "二维码不存在";
                }
                BufferedImage image = ImageIO.read(file);
                LuminanceSource source = new BufferedImageLuminanceSource(image);
                Binarizer binarizer = new HybridBinarizer(source);
                BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
                Map hints = new HashMap();
                hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
                result = formatReader.decode(binaryBitmap, hints);
            } catch (NotFoundException e) {
                e.printStackTrace();
            }
            return result;
        }
    }
    

    功能测试:

    public class Test {
        public static void main(String[] args){
            //测试制作二维码
            String text = "wzf制作的二维码!";
            String outputPath = "E://wzf.jpg";
            ZxingCode zc = new ZxingCode();
            zc.zxingCodeCreate(text,300,300,outputPath,"jpg");
    
            //测试解析二维码
            try {
                Object object = zc.zxingCodeAnalyze(outputPath);
                System.out.println(object.toString());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:JAVA实现二维码制作和读取

        本文链接:https://www.haomeiwen.com/subject/rpzwkftx.html