`

二维码生产与解析

阅读更多

 

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.IOException;
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.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
import com.google.zxing.WriterException;
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;

public class QRCodeUtils {
    private static final String CODE = "utf-8";
    private static final String IMAGE_TYPE = "png";
    private static final int BLACK = 0xFF000000;
    private static final int WHITE = 0xFFFFFFFF;
    private static final int LOGO_SIZE = 60;  

     /** 
     * 生成RQ二维码    默认生成二维码
     *  
     * @author wfhe 
     * @param content 
     *            内容 
     * @param height 
     *            高度(px) 
     * @param width 
     *            高度(px)
     *  
     */  
    public static BufferedImage getRQ(String content, Integer height, Integer width, 
             String logoPath, boolean needCompress) {
        if(height == null || height < 100) {
            height = 200;
        }
        if(width == null || width < 50) {
            width = height;
        }

        try {
            Hashtable<EncodeHintType, Object> h = new Hashtable<EncodeHintType, Object>();
            h.put(EncodeHintType.CHARACTER_SET, CODE);
            h.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            h.put(EncodeHintType.MARGIN, 1);

            BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, h);

            return toBufferedImage(bitMatrix, logoPath, needCompress);

        } catch (WriterException e) {
            e.printStackTrace();
        }

        return null;
    }

     /** 
     * 转换成图片 
     *  
     * @author wfhe 
     * @param bitMatrix 
     * @param logoPath logo文件路径
     * @param needCompress logo是否要压缩 
     * @return 
     */  
    private static BufferedImage toBufferedImage(BitMatrix bitMatrix, String logoPath, boolean needCompress ){
        int width = bitMatrix.getWidth();
        int height = bitMatrix.getHeight();
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
        for(int x = 0; x < width; x++) {
            for(int y = 0; y < height; y ++) {
                image.setRGB(x, y, bitMatrix.get(x, y)? BLACK : WHITE);
            }
        }

        if(logoPath != null && !"".equals(logoPath)) wlogo(image, logoPath, needCompress);
        return image;
    }

    /**
     *  生成一、二维码,写到文件中
     *  
     * @author wfhe
     * @param content 内容
     * @param height 高度
     * @param width 宽度
     * @param filePath 文件路径
     * @throws Exception 
     */
    public static void wQRFile(String content, Integer height, Integer width, String filePath,
             String logoPath, boolean needCompress
            ) throws Exception {
        if(filePath == null || "".equals(filePath)) throw new Exception("filePath erorr : " + filePath);
        File file = new File(filePath);
        if(file == null || file.exists() == false) {
            try {
                file.createNewFile();
            } catch (Exception e) {
                throw new Exception("filePath create fail : " + filePath);
            }
        }


        BufferedImage image  = getRQ(content, height, width, logoPath, needCompress);
        ImageIO.write(image, IMAGE_TYPE, file);
    }

    /**
     * @author wfhe
     * @param filePath 需要解析的二维码图片路径
     * @return
     */
    public static String resolve(String filePath) {
        try {
            if(filePath == null || "".equals(filePath)) throw new Exception("filePath erorr : " + filePath);
            File file = new File(filePath);
            if(file == null || file.exists() == false) throw new Exception("File Not Found : " + filePath);

            BufferedImage imge = ImageIO.read(file);

            LuminanceSource source = new BufferedImageLuminanceSource(imge);
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

            // 解码设置编码方式为:utf-8
            Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();  
            hints.put(DecodeHintType.CHARACTER_SET, CODE);  

            Result result = new MultiFormatReader().decode(bitmap, hints);

            return result.getText();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * @author wfhe
     * @param bufferedImage 图片缓存
     * @param logoPath logo 图片文件的路径
     * @param needCompress 是否要压缩logo
     */
    private static void wlogo(BufferedImage bufferedImage, String logoPath, boolean needCompress) { 
        try {
            File file = new File(logoPath);  
            if (!file.exists()) {  
                    throw new Exception("File Not Found : " + logoPath);
            }
            Image logo = ImageIO.read(file);
            int width = logo.getWidth(null);
            int height = logo.getHeight(null);
            if(needCompress){// 压缩LOGO
                width = LOGO_SIZE;
                height = LOGO_SIZE;

                logo = logo.getScaledInstance(width, height, Image.SCALE_SMOOTH);
                BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);  
                Graphics g = tag.getGraphics();  
                g.drawImage(logo, 0, 0, null); // 绘制缩小后的图  
                g.dispose();  
            }
            // 插入LOGO  
            Graphics2D grap = bufferedImage.createGraphics();
            int x = (bufferedImage.getWidth() - width) >> 1;
            int y = (bufferedImage.getHeight() - height) >> 1;
            grap.drawImage(logo, x, y, width, height, null);
            Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
            grap.setStroke(new BasicStroke(3f));
            grap.draw(shape);
            grap.dispose();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        String filePath = "d://1.png";
        String logoPath = "d://111.jpg";

        QRCodeUtils.wQRFile("http://www.baidu.com", null, null, filePath, logoPath, true);

        System.out.println("-----成生成功----");

        String s = QRCodeUtils.resolve(filePath);

        System.out.println("-----解析成功----");
        System.out.println(s);

    }

}

 

 

分享到:
评论

相关推荐

    基于Spring Boot的二维码生成与解析接口.zip

    本项目是关于"基于Spring Boot的二维码生成与解析接口",将重点探讨如何在Spring Boot环境中实现二维码的生成与解码功能。 首先,二维码(Quick Response Code)是一种二维条形码,能够存储更多的数据,包括URL、...

    二维码生产和解析

    1. Winform版二维码生产: Winform是.NET Framework环境下开发桌面应用程序的一种技术。在Winform中生成二维码,主要依赖于第三方库或组件。例如,Zxing.Net(ZXing,又称Google的Barcode Detection API)是一个流行...

    二维码条形码解析插件

    二维码和条形码是现代数据交换与识别的重要工具,广泛应用于零售、物流、仓储、门票等领域。ZXing(Zebra Crossing)是Google开发的一个开源项目,提供了一个强大的库,用于读取、写入多种格式的二维码和条形码。本...

    qrcode解析二维码

    在本压缩包中,包含了生成二维码和解析二维码的示例代码,可以帮助用户快速理解和应用二维码技术。 首先,我们要理解二维码的基本原理。二维码是由黑白相间的模块组成,这些模块编码了特定的信息。每个二维码由静区...

    QRcode生成、解析二维码项目与所有jar

    这个项目包含了二维码的生成与解析功能,并且提供了所有必要的JAR文件,使得开发者可以方便地在自己的应用中集成这些功能。 1. **QRcode生成**: 生成二维码的过程涉及到编码算法,它将文本信息转换为特定的二进制...

    QRCODE二维码生产

    总的来说,二维码生成与解析技术涉及编码理论、图像处理、模式识别等多个领域的知识,而提供的源代码则为我们提供了实现这些功能的具体手段,无论是用于实际项目开发还是学习研究,都是非常有价值的。通过深入理解和...

    二维码生成和解析代码包含jar包

    - 产品追溯:商品上的二维码用于追踪生产和销售信息。 - 门票验证:演唱会、电影票等通过二维码进行入场验证。 - 广告宣传:二维码作为广告中的互动元素,引导用户扫描获取更多信息。 总的来说,这个压缩包提供...

    利用zixng方式生产及解析二维码

    本文将深入探讨如何利用ZXing库(Zebra Crossing)进行二维码的生成与解析。 ZXing(发音为"zebra crossing",斑马线的意思)是一个开源的、多平台的条码解码库,支持多种条形码和二维码格式,包括QR码。ZXing库...

    vb纯代码生成二维码源代码,支持低中高容错生成

    本篇将深入探讨如何利用VB纯代码生成二维码,并解析其支持的低、中、高容错等级。 一、二维码基本概念 二维码是一种二维条形码,由黑白相间的单元组成,可以存储大量的文本、数字、甚至图片等信息。它分为多个版本...

    二维码解析

    - 产品追溯:产品包装上的二维码可以追溯生产流程和真伪验证。 - 广告推送:商家在广告中放置二维码,用户扫描后可直达更多信息或优惠活动页面。 7. **安全性考虑**: 虽然二维码方便快捷,但也存在安全风险。...

    基于Java的二维码识别系统.pdf

    该系统主要采用了Google的ZXing库来实现对一维及二维码的生成与解析。ZXing库以Java语言为基础,兼容多种格式的条码图像处理,支持使用手机摄像头的本地驱动,实现了扫描和解析功能。在ZXing工程中,主要使用的是...

    H5解析二维码插件以及源码.zip

    H5二维码解析插件使得Web应用能够更好地与现实世界互动,未来可能会出现更多创新的二维码应用场景。 综上所述,这个H5解析二维码插件的资源为开发者提供了一种便捷的集成二维码功能的方法,无论是在移动设备还是...

    java写swing版界面的二维码生产

    总结一下,创建一个Java Swing版的二维码生产界面涉及到以下关键知识点: 1. 了解QR码的原理和应用。 2. 熟悉并使用ZXing库进行QR码的生成。 3. 掌握Java Swing的基本组件和事件处理机制。 4. 能够将生成的二维码...

    DM二维码自动生成软件

    通过与倍加福(Pepperl+Fuchs)读码器的兼容性测试,DM二维码生成软件证明了其在工业环境中的可靠性和实用性。 一、二维码技术基础知识: 二维码,全称二维条形码,是条形码的一种升级形式,它能存储大量的信息,如...

    JAVA 生成二维码并设置失效机制

    1.通过QRCode.jar包生成二维码,可设置二维码图片格式,二维码图片存放路径,二维码尺寸,二维码颜色 2.二维码扫描内容分为两种,1种为...4.提供通过QRCode.jar生成二维码的全部生产线上代码,可直接运行,含有关键注释

    Halcon与工业相机(海康),视觉解析二维码

    本文将深入探讨Halcon这一强大的机器视觉软件如何与工业相机,特别是海康相机结合,实现高效、精确的二维码视觉解析。 Halcon是MVTec公司开发的一款功能全面的机器视觉软件,它提供了丰富的图像处理算法,包括形状...

    reportmachine3 二维码

    5. **兼容性**:ReportMachine3生成的二维码应兼容各种二维码读取设备,包括手机上的扫描应用,确保数据能被正确解析。 6. **安全性考虑**:虽然二维码提供了一种便捷的数据传递方式,但也需要注意安全问题。确保...

    如何应用二维码.pdf

    #### 一维条码与二维码的区别 一维条码自问世以来,在信息采集和处理方面发挥了重要作用,极大提高了工作效率。然而,由于其信息容量有限,仅能用于物品的标识,而非详细描述。相比之下,二维码能够提供更为丰富的...

    javascript二维码

    JavaScript二维码生成与应用详解 在数字化时代,二维码已经成为日常生活中不可或缺的一部分,用于快速分享信息、链接、图片等。本文将深入探讨如何使用JavaScript这一前端语言来生成和处理二维码,以便在网页应用中...

Global site tag (gtag.js) - Google Analytics