`
suko
  • 浏览: 74638 次
  • 性别: Icon_minigender_1
  • 来自: 富安
社区版块
存档分类
最新评论

Java生成二维码,扫描后跳转到指定的网站

阅读更多
本例我是应用google的二维码工具包来做的,附近提供jar包下载。下面是完整代码,经过测试的。

package test;

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 java.util.Random;

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.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

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;
  
    private static BufferedImage createImage(String content, String imgPath,  
            boolean needCompress) throws Exception {  
        Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();  
        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;  
    }  
  
    /** 
     * 插入LOGO 
     *  
     * @param source 
     *            二维码图片 
     * @param imgPath 
     *            LOGO图片地址 
     * @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();  
    }  
  
    /** 
     * 生成二维码(内嵌LOGO) 
     *  
     * @param content 
     *            内容 
     * @param imgPath 
     *            LOGO地址 
     * @param destPath 
     *            存放目录 
     * @param needCompress 
     *            是否压缩LOGO 
     * @throws Exception 
     */  
    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));  
    }  
  
    /** 
     * 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常) 
     * @author lanyuan 
     * Email: mmm333zzz520@163.com 
     * @date 2013-12-11 上午10:16:36 
     * @param destPath 存放目录 
     */  
    public static void mkdirs(String destPath) {  
        File file =new File(destPath);      
        //当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)  
        if (!file.exists() && !file.isDirectory()) {  
            file.mkdirs();  
        }  
    }  
  
    /** 
     * 生成二维码(内嵌LOGO) 
     *  
     * @param content 
     *            内容 
     * @param imgPath 
     *            LOGO地址 
     * @param destPath 
     *            存储地址 
     * @throws Exception 
     */  
    public static void encode(String content, String imgPath, String destPath)  
            throws Exception {  
        QRCodeUtil.encode(content, imgPath, destPath, false);  
    }  
  
    /** 
     * 生成二维码 
     *  
     * @param content 
     *            内容 
     * @param destPath 
     *            存储地址 
     * @param needCompress 
     *            是否压缩LOGO 
     * @throws Exception 
     */  
    public static void encode(String content, String destPath,  
            boolean needCompress) throws Exception {  
        QRCodeUtil.encode(content, null, destPath, needCompress);  
    }  
  
    /** 
     * 生成二维码 
     *  
     * @param content 
     *            内容 
     * @param destPath 
     *            存储地址 
     * @throws Exception 
     */  
    public static void encode(String content, String destPath) throws Exception {  
        QRCodeUtil.encode(content, null, destPath, false);  
    }  
  
    /** 
     * 生成二维码(内嵌LOGO) 
     *  
     * @param content 
     *            内容 
     * @param imgPath 
     *            LOGO地址 
     * @param output 
     *            输出流 
     * @param needCompress 
     *            是否压缩LOGO 
     * @throws Exception 
     */  
    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);  
    }  
  
    /** 
     * 生成二维码 
     *  
     * @param content 
     *            内容 
     * @param output 
     *            输出流 
     * @throws Exception 
     */  
    public static void encode(String content, OutputStream output)  
            throws Exception {  
        QRCodeUtil.encode(content, null, output, false);  
    }  
  
    /** 
     * 解析二维码 
     *  
     * @param file 
     *            二维码图片 
     * @return 
     * @throws Exception 
     */  
    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, Object> hints = new Hashtable<DecodeHintType, Object>();  
        hints.put(DecodeHintType.CHARACTER_SET, CHARSET);  
        result = new MultiFormatReader().decode(bitmap, hints);  
        String resultStr = result.getText();  
        return resultStr;  
    }  
  
    /** 
     * 解析二维码 
     *  
     * @param path 
     *            二维码图片地址 
     * @return 
     * @throws Exception 
     */  
    public static String decode(String path) throws Exception {  
        return QRCodeUtil.decode(new File(path));  
    }
    
    public static void main(String[] args) throws Exception {
        String text = "http://www.iteye.com";  //这里设置自定义网站url
        String logoPath = "d:\\zilv.jpg"; 
        String destPath = "d:\\"; 
        QRCodeUtil.encode(text, logoPath, destPath, true);  
    }
}


分享到:
评论

相关推荐

    java实现手机扫描二维码后网站跳转新页面

    总结来说,无论是使用ZXing还是Hutools,Java都可以方便地生成二维码并验证其内容,实现手机扫描后跳转到指定网页的功能。开发者可以根据项目需求和对库的熟悉程度选择合适的方法。在实际应用中,为了增强用户体验,...

    基于java开发的二维码生成小程序

    【基于Java开发的二维码生成小程序】是一个利用Java编程语言实现的实用工具,它能够帮助用户快速生成可扫描的二维码,这些二维码在扫描后能够跳转到预设的网站。这个小程序集成了二维码编码技术,使得非技术人员也能...

    扫二维码自动跳转【java】详解

    Java 扫二维码自动跳转是一种常见的技术,通过扫描二维码,实现自动跳转到指定页面或执行特定操作。本文将详细介绍 Java 扫二维码自动跳转的实现过程,包括生成 UUID、生成二维码、自动请求服务器查询二维码是否被...

    java生成相应跳转地址的二维码

    demo中含有jar包对应的maven地址,直接引入到pom中就可以使用了

    扫描二维码下载 JAVA实现20190403

    在实现扫描二维码下载功能时,我们首先需要集成二维码扫描库。对于JAVA环境,我们可以选择Zxing库,它提供了一套完整的二维码生成和识别API。在Android项目中,我们可以使用ZXing的Android端组件,如BarcodeScanner...

    web项目中为某个java类生成二维码图片

    移动端用户扫描这个二维码后,可以触发预览或跳转到相关页面。这通常需要一个能够解析二维码并处理相应数据的应用,如微信、支付宝或专门的二维码扫描APP。它们会根据扫描到的信息类型,执行相应的操作,比如打开...

    用Java实现生成带Logo的二维码并跳转到指定地址

    使用Java生成带有Logo的二维码并能够实现扫描二维码跳转到指定地址的功能,源码打的jar包,直接导入就可使用,仅需改几个地址就可使用,零基础的福音!

    二维码扫描并获取扫描的内容+生成二维码

    2. **生成矩阵**:将编码后的二进制数据映射到一个二维的黑白矩阵上。 3. **添加定位和校验信息**:在矩阵的四个角落添加定位图案,以及根据需要添加校验信息,以确保二维码的可识别性。 4. **图像渲染**:将矩阵...

    java链接生成二维码

    对于微信朋友圈分享,你可以将生成的二维码图片上传至服务器,然后通过微信的分享接口生成带有二维码图片的分享卡片,用户扫描后可以直接跳转到对应的网页。同时,二维码可以携带参数,比如通过URL参数的方式,这样...

    Android二维码实现扫描生成

    二维码扫描** 要实现在Android应用中扫描二维码,首先需要集成ZXing库。这可以通过添加ZXing的AAR依赖到项目的build.gradle文件中,或者将ZXing的源码导入项目。依赖添加后,可以创建一个扫描界面,通常是一个...

    java生成二维码完成Demo

    本教程将详细介绍如何利用Java代码生成二维码并将其转化为图片,以便用户扫描查看内容或跳转到指定的超链接地址。 首先,我们需要一个Java的二维码生成库,例如`qrcode-generator`或`com.google.zxing`。这里我们...

    java(二维码生成demo)

    通过学习和理解这个Java二维码生成的示例,开发者不仅可以掌握如何生成二维码,还可以了解到如何在自己的应用中整合这一功能,提高用户体验。在实际场景中,二维码常用于网址跳转、电子票务、数据交换等方面。

    java生成二维码源码案例及jar包

    本资源包含了一个使用Java生成二维码的源码案例以及必要的jar包,这对于理解和实践Java二维码生成非常有帮助。 首先,我们需要了解什么是二维码。二维码(Quick Response Code)是二维条形码的一种,它能在有限的...

    Zxing生成二维码扫描二维码

    2. 网站跳转:二维码内嵌网址,用户扫描后可以直接打开网页,方便快捷。 3. 电子名片:通过二维码存储个人联系方式,扫描即可导入到手机通讯录。 4. 商品溯源:商品包装上的二维码可以追溯产品信息,保障消费者权益...

    Java实现的生成二维码统计扫描次数并转发到某个地址功能详解

    Java实现的生成二维码统计扫描次数并转发到某个地址功能详解 本文主要介绍了Java实现的生成二维码统计扫描次数并转发到某个地址功能的详细实现过程。该功能可以生成带统计功能的二维码,涉及Java二维码的生成、参数...

    jsp 生成二维码的工具类

    本工具类专为这个目的设计,能够帮助开发者方便地在JSP页面中生成二维码并实现扫描后自动跳转到指定的URL。 首先,我们需要了解二维码(Quick Response Code)的基本概念。二维码是一种二维条码,可以存储比传统一...

    java生成二维码共2页.pdf.zip

    Java生成二维码是一个常见的任务,尤其在移动互联网应用中,用于数据传输、链接跳转或作为电子凭证。这个压缩包文件“java生成二维码共2页.pdf.zip”似乎包含了一个关于如何在Java环境中创建二维码的教程,可能包括...

    一键生成二维码 扫描二维码 Zxing包JAR包

    总结,Zxing是一个强大而灵活的二维码处理库,无论是简单的生成二维码用于分享信息,还是复杂的扫描功能集成到移动应用中,它都能提供高效且可靠的解决方案。通过深入理解和实践,开发者可以轻松地利用Zxing实现一键...

    Android扫描二维码及生成二维码Demo

    在实际项目中,你可能还需要处理扫描结果的解析,如跳转到特定网页、存储扫描记录、处理不同类型的扫码事件等。 总之,这个"Android扫描二维码及生成二维码Demo"涵盖了Android应用中与二维码交互的核心技术,对于...

    zxing 二维码扫描demo +js二维码生成demo

    手机端的ZXing二维码扫描功能常用于移动应用中,比如扫描商品条码获取价格信息,或者扫描网页上的二维码快速跳转到相应页面。而Web端的JS二维码生成则广泛应用于网站,用户可以生成二维码分享网址、电子名片或者下载...

Global site tag (gtag.js) - Google Analytics