zxing解析生成一维码二维码

@web界面实现扫一扫

二维码工具类

package util;

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.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URL;
import java.util.HashMap;
import java.util.Hashtable;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.NotFoundException;
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;

import net.sf.json.JSONObject;

/**
 * @todo 二维码工具
 * @author zhangyanan
 * @date 2018年8月6日
 */
public class QRCodeUtil {
    private static final String CHARSET = "UTF-8";
    private static final String FORMAT_NAME = "JPG";
    // 二维码尺寸
    private static final int QRCODE_SIZE = 200;
    // LOGO宽度
    private static final int WIDTH = 40;
    // LOGO高度
    private static final int HEIGHT = 40;

    public static void main(String[] args) throws Exception {
        create();
        // System.out.println(decoderQRCode("D:/8.jpg"));
        // System.out.println(decodeBarCode("D:/8.jpg"));
    }

    private static void create() throws Exception, FileNotFoundException {
        String dir = "E:/QR.jpg";
        String content = "微信提醒您:您的账户已被盗";// ConfigUtil.getProperty("project.url")
        String logoImgPath = "file:///taobao.jpg";// "http://192.168.100.2/cut.jpg";
        File file = new File(dir);
        QRCodeUtil.encode(content, logoImgPath, new FileOutputStream(file), true);
        System.out.println("生成二维码成功");
    }

    /**
     * @todo
     * @author zhangyanan
     * @date 2018年8月6日
     * @param content
     *            二维码内容
     * @param logoImgPath
     *            Logo
     * @param needCompress
     *            是否压缩Logo
     * @return 返回二维码图片
     * @throws WriterException
     * @throws IOException
     *             BufferedImage TODO 创建二维码图片
     */
    private static BufferedImage createImage(String content, String logoImgPath, boolean needCompress)
            throws WriterException, IOException {
        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, 0);
        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 (logoImgPath == null || "".equals(logoImgPath)) {
            return image;
        }

        // 插入图片
        QRCodeUtil.insertImage(image, logoImgPath, needCompress);
        return image;
    }

    /**
     * @todo
     * @author zhangyanan
     * @date 2018年8月6日
     * @param source
     *            二维码图片
     * @param logoImgPath
     *            Logo
     * @param needCompress
     *            是否压缩Logo
     * @throws IOException
     *             void TODO 添加Logo
     */
    private static void insertImage(BufferedImage source, String logoImgPath, boolean needCompress) throws IOException {
        /*
         * File file = new File(logoImgPath); if (!file.exists()) { return; }
         */
        URL url = new URL(logoImgPath);
        Image src;
        try {
            src = ImageIO.read(url.openStream());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            // e.printStackTrace();
            return;
        }
        // Image src = ImageIO.read(new File(logoImgPath));
        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();
    }

    /**
     * @todo
     * @author zhangyanan
     * @date 2018年8月6日
     * @param content
     *            二维码内容
     * @param logoImgPath
     *            Logo
     * @param destPath
     *            二维码输出路径
     * @param needCompress
     *            是否压缩Logo
     * @throws Exception
     *             void TODO 生成带Logo的二维码
     */
    public static void encode(String content, String logoImgPath, String destPath, boolean needCompress)
            throws Exception {
        BufferedImage image = QRCodeUtil.createImage(content, logoImgPath, needCompress);
        FileUtils.mkdirs(destPath);
        ImageIO.write(image, FORMAT_NAME, new File(destPath));
    }

    /**
     * @todo
     * @author zhangyanan
     * @date 2018年8月6日
     * @param content
     *            二维码内容
     * @param destPath
     *            二维码输出路径
     * @throws Exception
     *             void TODO 生成不带Logo的二维码
     */
    public static void encode(String content, String destPath) throws Exception {
        QRCodeUtil.encode(content, null, destPath, false);
    }

    /**
     * @todo
     * @author zhangyanan
     * @date 2018年8月6日
     * @param content
     *            二维码内容
     * @param logoImgPath
     *            Logo
     * @param output
     *            输出流
     * @param needCompress
     *            是否压缩Logo
     * @throws Exception
     *             void TODO 生成带Logo的二维码,并输出到指定的输出流
     */
    public static void encode(String content, String logoImgPath, OutputStream output, boolean needCompress)
            throws Exception {
        BufferedImage image = QRCodeUtil.createImage(content, logoImgPath, needCompress);
        ImageIO.write(image, FORMAT_NAME, output);
    }

    /**
     * @todo
     * @author zhangyanan
     * @date 2018年8月6日
     * @param content
     *            二维码内容
     * @param output
     *            输出流
     * @throws Exception
     *             void TODO 生成不带Logo的二维码,并输出到指定的输出流
     */
    public static void encode(String content, OutputStream output) throws Exception {
        QRCodeUtil.encode(content, null, output, false);
    }

    /**
     * @todo 解析二维码
     * @author zhangyanan
     * @date 2018年8月6日
     */
    @SuppressWarnings("unchecked")
    public static JSONObject decoderQRCode(String imgPath) {
        JSONObject json = new JSONObject();
        try {
            MultiFormatReader formatReader = new MultiFormatReader(); // 二维码图片位置
            File file = new File(imgPath);
            BufferedImage image = ImageIO.read(file);
            BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
            // 定义二维码的参数
            @SuppressWarnings("rawtypes")
            HashMap hints = new HashMap(); // 设置编码字符集
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            // 处理读取结果
            Result result = formatReader.decode(binaryBitmap, hints);
            // System.out.println("解析结果:" + result.toString());
            // System.out.println("二维码格式类型:" + result.getBarcodeFormat());
            // System.out.println("二维码文本内容:" + result.getText());
            json.put("result", true);
            // json.put("qrcode",result.getBarcodeFormat());
            json.put("qrtext", result.getText());
            json.put("msg", "解析成功");
        } catch (NotFoundException e) {
            e.printStackTrace();
            json.put("result", false);
            json.put("msg", "解析失败,请保证图片清晰重试");
        } catch (IOException e) {
            e.printStackTrace();
            json.put("result", false);
            json.put("msg", "解析失败,请保证图片清晰重试");
        }
        return json;

    }

}

一维码工具类,一维码@参考文章

package util;

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.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;

import net.sf.json.JSONObject;

/**
 * TODO 条形码工具类 2019年12月6日
 *
 * @author zhangyanan
 */
public class BarCodeUtil {

    private static final int BLACK = 0xFF000000;
    private static final int WHITE = 0xFFFFFFFF;
    private static final String CHARSET = "UTF-8";

    public static void main(String[] args) throws Exception {
        String text = "9999000026";
        String result;
        String format = "png";
        File outputFile = new File("d:" + File.separator + "rqcode.png");
        outputFile = new File("d:" + File.separator + "barcode.png");
        BarCodeUtil.writeToFile(BarCodeUtil.toBarCodeMatrix(text, null, null), format, outputFile);
        result = BarCodeUtil.decode(outputFile);
        System.out.println(result);
    }

    /**
     * TODO 将字符串编成一维条码的矩阵 2019年12月6日
     *
     * @author zhangyanan
     */
    public static BitMatrix toBarCodeMatrix(String str, Integer width, Integer height) {

        if (width == null || width < 200) {
            width = 200;
        }

        if (height == null || height < 50) {
            height = 50;
        }

        try {
            // 文字编码
            Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
            hints.put(EncodeHintType.CHARACTER_SET, CHARSET);

            BitMatrix bitMatrix = new MultiFormatWriter().encode(str, BarcodeFormat.CODE_128, width, height, hints);

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

    /**
     * TODO 根据矩阵、图片格式,生成文件。 2019年12月6日
     *
     * @author zhangyanan
     */
    public static void writeToFile(BitMatrix matrix, String format, File file) throws IOException {
        BufferedImage image = toBufferedImage(matrix);
        if (!ImageIO.write(image, format, file)) {
            throw new IOException("Could not write an image of format " + format + " to " + file);
        }
    }

    /**
     * TODO 解码,需要javase包。 2019年12月6日
     *
     * @author zhangyanan
     */
    public static String decode(File file) {

        BufferedImage image;
        try {
            if (file == null || file.exists() == false) {
                throw new Exception(" File not found:" + file.getPath());
            }

            image = ImageIO.read(file);

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

            Result result;

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

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

            return result.getText();

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

        return null;
    }

    /**
     * TODO 根据点矩阵生成黑白图。 2019年12月6日
     *
     * @author zhangyanan
     */
    public static BufferedImage toBufferedImage(BitMatrix matrix) {
        int width = matrix.getWidth();
        int height = matrix.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, matrix.get(x, y) ? BLACK : WHITE);
            }
        }
        return image;
    }

    /**
     * TODO 解析条形码 2019年12月6日
     *
     * @author zhangyanan
     */
    public static JSONObject decodeBarCode(String imgPath) {
        JSONObject json = new JSONObject();
        BufferedImage image = null;
        Result result = null;
        try {
            image = ImageIO.read(new File(imgPath));
            if (image == null) {
                System.out.println("the decode image may be not exit.");
            }
            LuminanceSource source = new BufferedImageLuminanceSource(image);
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
            /*
             * Map<DecodeHintType, Object> hints = new Hashtable<>();
             * hints.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
             * hints.put(DecodeHintType.CHARACTER_SET, "utf-8"); result = new
             * MultiFormatReader().decode(bitmap, hints);
             */
            result = new MultiFormatReader().decode(bitmap, null);
            json.put("result", true);
            json.put("msg", "解析条形码成功");
            // json.put("qrcode",result.getBarcodeFormat());
            json.put("qrtext", result.getText());
            System.out.println("解析结果:" + result.toString());
            System.out.println("条形码格式类型:" + result.getBarcodeFormat());
            System.out.println("条形码文本内容:" + result.getText());
        } catch (Exception e) {
            e.printStackTrace();
            json.put("result", false);
            json.put("msg", "解析失败,请保证图片清晰重试");
        }
        return json;
    }

}

原文地址:https://www.cnblogs.com/yanan7890/p/11994091.html

时间: 2024-10-08 02:57:59

zxing解析生成一维码二维码的相关文章

ZXing生成条形码、二维码、带logo二维码

采用的是开源的ZXing,Maven配置如下,jar包下载地址,自己选择版本下载,顺便推荐下Maven Repository <!-- https://mvnrepository.com/artifact/com.google.zxing/core --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version

java利用zxing生成仿新浪微博二维码

原文:java利用zxing生成仿新浪微博二维码 源代码下载地址:http://www.zuidaima.com/share/1550463729896448.htm 效果图: 说明在readme.txt文件

制作、解析带logo的二维码

用DecoderQRCode来解析带logo的二维码,发现报错,解析不了,于是便又查资料,找到了更强大的制作二维码 工具:GooleZXing 首先下GooleZXing的jar包. ----------------------------------------生成二维码------------------------------------------------ public class GooleZXingQRCodeUtil { private static final String

生成条形码和二维码并实现打印的功能

生成条形码和二维码并实现打印的功能     开篇:平台下编解条形码和二维码的工具. 下载地址:http://pan.baidu.com/s/1kTr3Vuf Step1:使用VS2010新建一个窗体程序项目: Step2:添加三个类:分别是BarCodeClass.cs.DocementBase.cs.imageDocument.cs.(下一步贴出这些类的代码);;;;添加下载回来的引用zxing.dll. >说明: <1>   BarCodeClass.cs主要用来实现条形码和二维码的

ajax加一般处理程序或ASP.NET 后台生成带着二维码的图片

ajax加一般处理程序生成带着二维码的图片 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head

ZXing.NET(条码、二维码)

    ZXing.NET用来生成和解释 (条码.二维码) 添加引用:zxing.dll.zxing.presentation.dll 1 生成 (条码.二维码)主要用到 BarcodeWriter.BarcodeFormat.EncodingOptions.BitmapRenderer 这几个类. 2  解释 (条码.二维码)主要用到 BarcodeReader.DecodingOptions 这两个类. /// <summary> /// 条码.二维码 /// </summary&g

Java微信公众平台开发之生成带参二维码(Spring Boot 2.X)

微信官方提供的生成二维码接口得到的是当前公众号的二维码官方文档(一定要先看)目前有2种类型的二维码:临时二维码,是有过期时间的,最长可以设置为在二维码生成后的30天(即2592000秒)后过期,但能够生成较多数量,主要用于帐号绑定等不要求二维码永久保存的业务场景永久二维码,是无过期时间的,但数量较少(目前为最多10万个),主要用于适用于帐号绑定.用户来源统计等场景获取带参数的二维码有两种方法先获取二维码ticket,然后凭借ticket通过接口换取二维码图片,但是得到ticket之前首先得获取微

使用ZBarSDK生成和读取二维码

1.下载ZBarSDK,下载地址:http://zbar.sourceforge.net/iphone/index.html2.新建项目,导入ZBarSDK,并添加下列frameworkCoreMedia.frameworkCoreVideo.frameworkAVFoundation.frameworkQuartzCore.frameworklibiconv.dyliblibzbar.a3.扫瞄二维码(全屏)(1)在viewController界面导入头文件 #import"ZBarSDK.h

Zxing图片拉伸解决 Android 二维码扫描

二维码扫描  Android Zxing图片拉伸解决 Zxing是google提供的二维码扫描工程 默认是横屏的  转换成竖屏后图片出现拉伸 这里提供解决办法: Zxing  修改 CameraConfigurationManager.java文件的 void initFromCameraParameters(Camera camera)方法 在 Log.d(TAG, "Screen resolution: " + screenResolution);这句之后增加 Point scre

微信公众平台开发(83) 生成带参数二维码

本文介绍在微信公众平台上如何使用高级接口开发生成带参数二维码的功能. 一.场景二维码 为了满足用户渠道推广分析的需要,公众平台提供了生成带参数二维码的接口.使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送. 目前有2种类型的二维码,分别是临时二维码和永久二维码,前者有过期时间,最大为1800秒,但能够生成较多数量,后者无过期时间,数量较少(目前参数只支持1--100000).两种二维码分别适用于帐号绑定.用户来源统计等场景. 用户扫描带场景值二维码时,可能推送以下