【Java 二维码】生成二维码

ZXingCodeEncodeUtils    生成及解析二维码项目
package utils;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.InputStream;
import java.util.EnumMap;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

/**
 * 生成二维码
 */
public class ZXingCodeEncodeUtils {

    public static void main(String[] args) {
        //        createZXingCodeSaveToDisk("kikyo", 400, 400, "D:/kikyo.gif", "JPEG");
        InputStream logoStream = ZXingCodeEncodeUtils.class.getClassLoader().getResourceAsStream("image/logo.jpg");
        createZxingCodeUseLogoSaveToDisk("kikyo", 400, 400, "D:/kikyo.jpg", "JPEG", logoStream);
        System.out.println("生成成功");
    }

    // 二维码颜色
    private static final int BLACK = 0xFF000000;
    // 二维码背景颜色
    private static final int WHITE = 0xFFFFFFFF;

    // 二维码格式参数
    private static final EnumMap<EncodeHintType, Object> hints = new EnumMap<EncodeHintType, Object>(EncodeHintType.class);

    static {
        /*
         * 二维码的纠错级别(排错率),4个级别: L (7%)、 M (15%)、 Q (25%)、 H (30%)(最高H)
         * 纠错信息同样存储在二维码中,纠错级别越高,纠错信息占用的空间越多,那么能存储的有用讯息就越少;共有四级; 选择M,扫描速度快。
         */
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        // 二维码边界空白大小 1,2,3,4 (4为默认,最大)
        hints.put(EncodeHintType.MARGIN, 1);
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");// 设置放入的字符的编码
    }

    /**
     * 生成二维码保存到目标路径
     */
    public static void createZXingCodeSaveToDisk(String content, int width, int height, String savePath, String imageType) {
        try {
            BufferedImage image = createZXingCodeNormal(content, width, height);
            // 保存图片到硬盘
            File file = new File(savePath);
            if (!file.exists()) {
                file.createNewFile();
            }
            ImageIO.write(image, imageType, file);
            System.out.println("生成成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成二维码返回图片对象
     */
    public static BufferedImage createZXingCodeNormal(String content, int width, int height) {
        try {
            BitMatrix encode = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
            // 得到二维码的宽度
            int code_width = encode.getWidth();
            int code_height = encode.getHeight();
            // 创建图片
            BufferedImage image = new BufferedImage(code_width, code_height, BufferedImage.TYPE_INT_RGB);
            // 把二维码里面的信息写到图片里面
            for (int i = 0; i < code_width; i++) {
                for (int j = 0; j < code_height; j++) {
                    image.setRGB(i, j, encode.get(i, j) ? BLACK : WHITE);
                }
            }
            return image;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 生成一张带logo的二维码
     *
     * @param logoStream logo的流对象
     */
    public static void createZxingCodeUseLogoSaveToDisk(String content, int width, int height, String savePath,
                                                        String imageType, InputStream logoStream) {
        try {
            BufferedImage codeImage = createZxingCodeUseLogo(content, width, height, logoStream);
            // 保存图片到硬盘
            File file = new File(savePath);
            if (!file.exists()) {
                file.createNewFile();
            }
            ImageIO.write(codeImage, imageType, file);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成一张带logo的二维码  返回BuffredeImage
     *
     * @param logoStream logo的流对象
     */
    public static BufferedImage createZxingCodeUseLogo(String content, int width, int height, InputStream logoStream) {
        try {
            //生成二维码图片
            BufferedImage codeNormal = createZXingCodeNormal(content, width, height);
            //判断logoStream是否为空
            if (null == codeNormal || null == logoStream) {
                System.out.println("codeNormal or logoStream is null");
                return null;
            }
            //拿到可以操作当前图片的画笔
            Graphics2D graphics = codeNormal.createGraphics();
            //得到logo图片的对象
            BufferedImage logoImage = ImageIO.read(logoStream);
            //得到logo的原始宽高
            int old_logo_width = logoImage.getWidth();
            int old_logo_height = logoImage.getHeight();

            //得到二维码的宽高
            int code_width = codeNormal.getWidth();
            int code_height = codeNormal.getHeight();

            //算出logo在二维码里面能存在的最大值
            int logo_max_width = code_width / 5;
            int logo_max_height = code_height / 5;

            //计算logo的可用宽高
            int logo_width = logo_max_width < old_logo_width ? logo_max_width : old_logo_width;
            int logo_height = logo_max_height < old_logo_height ? logo_max_height : old_logo_height;

            //计算logo的开始点的坐标
            int x = (code_width - logo_width) / 2;
            int y = (code_height - logo_height) / 2;

            /**
             * logoImage logo图片对象
             * x 开始画的x轴坐标
             * y 开始画的y轴的坐
             * logo_width 要画的x轴的长度
             * logo_height 要画的y车的长度
             * arg5  null
             */
            graphics.drawImage(logoImage, x, y, logo_width, logo_height, null);

            graphics.setStroke(new BasicStroke(2));
            graphics.setColor(Color.WHITE);
            //画白色边框
            graphics.drawRoundRect(x, y, logo_width, logo_height, 15, 15);
            graphics.dispose();//让画上的去的内容生效
            return codeNormal;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("生成失败  " + e.getMessage());
            return null;
        }
    }
}
ZXingCodeDecodeUtils
package utils;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.EnumMap;

import javax.imageio.ImageIO;

import com.google.zxing.Binarizer;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;

/**
 * 解析二维码
 */
public class ZXingCodeDecodeUtils {

    public static void main(String[] args) throws FileNotFoundException {
        //  String string = decodeCodeFile("D:/kikyo.gif");
        String string = decodeCodeStream(new FileInputStream(new File("D:/kikyo.jpg")));
        System.out.println(string);
    }

    // 二维码格式参数
    private static final EnumMap<DecodeHintType, Object> decodeHints = new EnumMap<DecodeHintType, Object>(DecodeHintType.class);

    static {
        decodeHints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
    }

    /**
     * 解析文件
     */
    public static String decodeCodeFile(String path) {
        File file = new File(path);
        if (!file.exists())
            return null;
        // 把文件转成图片对象
        try {
            String content = decodeCodeStream(new FileInputStream(file));
            return content;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 解析流
     */
    public static String decodeCodeStream(InputStream inputStream) {
        if (null == inputStream)
            return null;
        try {
            BufferedImage image = ImageIO.read(inputStream);
            LuminanceSource source = new BufferedImageLuminanceSource(image);
            Binarizer binarizer = new HybridBinarizer(source);
            BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
            MultiFormatReader reader = new MultiFormatReader();
            Result result = reader.decode(binaryBitmap, decodeHints);
            String content = result.getText();
            return content;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
CodeServlet
@WebServlet("/code.action")
public class CodeServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //生成图片
//        BufferedImage codeImage=ZXingCodeEncodeUtils.createZXingCodeNormal("kikyo", 300, 300);
        InputStream logoStream = this.getClass().getClassLoader().getResourceAsStream("/image/logo.jpg");
        BufferedImage codeImage = ZXingCodeEncodeUtils.createZxingCodeUseLogo("kikyo", 300, 300, logoStream);

        ServletOutputStream outputStream = response.getOutputStream();
        ImageIO.write(codeImage, "JPEG", outputStream);
        outputStream.close();
    }
}
DeCodeServlet
@WebServlet("/decode.action")
@MultipartConfig
public class DeCodeServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Part part = request.getPart("mf");
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        String string = ZXingCodeDecodeUtils.decodeCodeStream(part.getInputStream());
        PrintWriter out = response.getWriter();
        out.write(string);
        out.flush();
        out.close();
    }
}

index.jsp

<img alt="" src="code.action" >
<form action="decode.action" method="post" enctype="multipart/form-data">
    <input type="file" name="mf">
    <input type="submit" value="解析">
</form>

pom.xml

        <!-- servlet -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <!-- ZXing -->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.3.3</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.3.3</version>
        </dependency>

原文地址:https://www.cnblogs.com/kikyoqiang/p/12250541.html

时间: 2024-08-29 11:47:16

【Java 二维码】生成二维码的相关文章

【java工具类】生成二维码

/** * 生成二维码图片 * @param text 扫描二维码后跳转的url * @param width 图片宽度 * @param height 图片高度 * @param filePath 图片生成路径 比如"G://pic//1-1G124104A5.jpg" * @throws WriterException * @throws IOException */public static void generateQRCodeImage(String text, int wi

二维码生成,二维码中嵌套图片,文字生成图片

package com.fh.util; import java.awt.BasicStroke;import java.awt.Color;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream; import javax.

iOS中 扫描二维码/生成二维码详解 韩俊强的博客

最近大家总是问我有没有关于二维码的demo,为了满足大家的需求,特此研究了一番,希望能帮到大家! 每日更新关注:http://weibo.com/hanjunqiang  新浪微博 指示根视图: self.window.rootViewController = [[UINavigationController alloc]initWithRootViewController:[SecondViewController new]]; 每日更新关注:http://weibo.com/hanjunqi

HTML5实现扫描识别二维码/生成二维码

扫描识别二维码 思路: 1. 操作摄像头,获取图片.HTML5 WEBRTC的navigator.getUserMedia方法去实时获取摄像头资源. 2. 利用canvas使用相关算法分析图片识别图片得出结果,可用jquery.qrcode分析二维码 .(技术点:getImageData) 局限性: 移动平台支持getUserMedia/Stream API的浏览器比较少,支持列表http://caniuse.com/#feat=stream (目前没发现有IOS是支持的) 代码实现: 感谢gi

Java二维码生成与解码

基于google zxing 的Java二维码生成与解码 一.添加Maven依赖(解码时需要上传二维码图片,所以需要依赖文件上传包) <!-- google二维码工具 --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.1.0</version> </dependen

通过jquery-qrcode在线生成二维码

随着移动互联网的发展,二维码现在应用得越来越广泛了,随手扫扫就可以浏览网站.加个好友什么的,比起手工输入真的是方便太多了. 前期做了一个综合测评系统,考虑逐步实现移动化,一长串的IP地址用户输入也不方便,借助二维码的话,用户拿起手机扫扫就可以直接进入系统. 基于这个应用场景,就上网研究下了网站二维码的实现方式,归纳起来有以下两种: 1.借助一些二维码生成网站或者二维码生成器生成二维码图片,然后挂在网站上,如码云 QR-Code (二维码) 在线生成器 优点:开发成本为零,能够快速实现多样化的二维

QRcode二维码 生成与解析

import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcod

Android 开发中使用到二维码生成和解析

二维码生成 二维码解析 在项目的开发中, 使用二维码作为数据传递 交换 已经是常态了! 在这我也讲讲自己在项目开发中使用到的二维码. 生成二维码的开发流程 1 应用google 给我们提供的zxing.jar (建议官网下载) 2 使用zxing.jar 的MultiFormatWriter 类 生成一张二维码图片 核心代码块 /** * 方法说明:生成无图片二维码 */ @SuppressWarnings("unused") private Bitmap createTwoCode(

C#MVC生成二维码

首先大家看我的上一个文章写得是WinFrom 实现条形码生成读取 这次我来呈现出MVC B/S 页面实现 一维码,二维码 1.3 第三方类库:ZXing.Net 1.3.1 说明 ZXing 是一个可生成和读取 1D/2D(1维/2维) 条形码的开源类库.原先是Java版本,后由第三方衍生了支持QT.C++..Net等版本. .Net版本支持的平台:.Net 2.0, 3.5 and 4.0.Silverlight 4 and 5.Windows Phone 7.0, 7.1 and 8.0.W

PHP二维码生成

原文链接:http://www.qqdeveloper.com/detail/14/1.html 代码下载地址:链接:http://pan.baidu.com/s/1dFgqiaP 密码:lex5 材料下载地址:参考原文链接 下面为大致代码讲解: 一.PHP实现基本的二维码 <?php // 引入qrcode类库文件,并实例化 require "./phpqrcode/qrlib.php"; $qrcode = new QRcode(); $qrcode::png("h