qr 生成二维码

package com.common;

import com.swetake.util.Qrcode;
import jp.sourceforge.qrcode.QRCodeDecoder;
import com.swetake.util.Qrcode;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Created by lxl on 2016-09-10.
 */
public class QRCodeUtils {

    /**
     * 生成二维码
     * @param qrContent 存入的内容
     * @param w 二维码 宽度
     * @param h 二维码 高度
     * @param filePath 二维码 存储路径
     * @param fileName 二维码 名称
     * @return 返回文件名称
     */
    public static String encoderQRCode(String qrContent, int w, int h, String filePath, String fileName) {
        Lock lock = new ReentrantLock();
        lock.lock();
        String FilePath = "";
        try {
            Qrcode qrcode = new Qrcode();
            qrcode.setQrcodeErrorCorrect(‘M‘);
            qrcode.setQrcodeEncodeMode(‘B‘);
            qrcode.setQrcodeVersion(7);
            //如果给定的路径不存在创建
            File fp = new File(filePath);
            if (!fp.exists()) {
                fp.mkdirs();
            }
            byte[] d = new byte[0];
            try {
                d = qrContent.getBytes("GBK");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            BufferedImage bi = new BufferedImage(139, 139, BufferedImage.TYPE_INT_RGB);
            // createGraphics
            Graphics2D g = bi.createGraphics();
            // set background
            g.setBackground(Color.WHITE);
            g.clearRect(0, 0, w, h);
            g.setColor(Color.BLACK);

            if (d.length > 0 && d.length < 123) {
                boolean[][] b = qrcode.calQrcode(d);
                for (int ii = 0; ii < b.length; ii++) {
                    for (int j = 0; j < b.length; j++) {
                        if (b[j][ii]) {
                            g.fillRect(j * 3 + 2, ii * 3 + 2, 3, 3);
                        }
                    }
                }
            }
            g.dispose();
            bi.flush();

            FilePath = filePath + fileName;
            File f = new File(FilePath);

            try {
                ImageIO.write(bi, "png", f);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
        } finally {
            lock.unlock();
        }
        System.out.println("doned!");
        return fileName;
    }

    /**
     * 读取二维码内容
     * @param imageFile
     * @return
     */
    public static String decoderQRCode(File imageFile) {
        Lock lock = new ReentrantLock();
        lock.lock();
        String decodedData = null;
        try {
            QRCodeDecoder decoder = new QRCodeDecoder();
            BufferedImage image = null;
            try {
                image = ImageIO.read(imageFile);
            } catch (IOException e) {
                System.out.println("Error: " + e.getMessage());
            }

            try {
                decodedData = new String(decoder.decode(new J2SEImage(image)), "GBK");
                System.out.println("Output Decoded Data is:" + decodedData);
            } catch (Exception dfe) {
                System.out.println("Error: " + dfe.getMessage());
            }
        } catch (Exception e) {
        } finally {
            lock.unlock();
        }
        return decodedData;
    }
}

------------------------------------------------------------end--------------------------------------------------------------------------

下面部分是扩展部分

二维中不仅可以存储字符,还可以存储图片,需要将要存储的图片转换成字节流,注意图片最大只可以存储2kb左右,对你没有听错,就是2kb

/**
     * 将指定的图片转换为字节
     * @param path
     * @return
     */
    public static byte[] image2byte(String path){
        byte[] data = null;
        FileImageInputStream input = null;
        try {
            input = new FileImageInputStream(new File(path));
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            byte[] buf = new byte[1024];
            int numBytesRead = 0;
            while ((numBytesRead = input.read(buf)) != -1) {
                output.write(buf, 0, numBytesRead);
            }
            data = output.toByteArray();
            output.close();
            input.close();
        }
        catch (FileNotFoundException ex1) {
            ex1.printStackTrace();
        }
        catch (IOException ex1) {
            ex1.printStackTrace();
        }
        return data;
    }
将二维码中读取出的字节转换成图片
    /**
     * 将二维码中读取出的字节转换成图片
     * @param data
     * @param path
     */
    public static void byte2image(byte[] data,String path){
        if(data.length<3||path.equals("")) return;
        try{
            FileImageOutputStream imageOutput = new FileImageOutputStream(new File(path));
            imageOutput.write(data, 0, data.length);
            imageOutput.close();
        } catch(Exception ex) {
            System.out.println("Exception: " + ex);
            ex.printStackTrace();
        }
    }

完成代码

package hbxt;

import com.swetake.util.Qrcode;
import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.exception.DecodingFailedException;
import org.apache.commons.codec.binary.Base64;

import javax.imageio.ImageIO;
import javax.imageio.stream.FileImageInputStream;
import javax.imageio.stream.FileImageOutputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;

/**
 * Hello world!
 *
 */
public class App
{
    static int size=40;
    // 图片尺寸
    static int imgSize = 500 + 12 * (size - 1);
    public static byte[] createQRCode(String imgPath) {
        byte[] result = null;
        try {
            Qrcode qrcodeHandler = new Qrcode();
            qrcodeHandler.setQrcodeErrorCorrect(‘M‘);
            qrcodeHandler.setQrcodeEncodeMode(‘B‘);
            qrcodeHandler.setQrcodeVersion(size);

            byte[] contentBytes =image2byte(imgPath);
            BufferedImage bufferImgage = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);

            Graphics2D graphics2D = bufferImgage.createGraphics();
            graphics2D.setBackground(Color.WHITE);
            graphics2D.clearRect(0, 0, imgSize, imgSize);
            graphics2D.setColor(Color.BLACK);
            int pixoff = 10;
            if (contentBytes.length > 0 && contentBytes.length < 3000) {
                boolean[][] matrix = qrcodeHandler.calQrcode(contentBytes);
                for (int i = 0; i < matrix.length; i++) {
                    for (int j = 0; j < matrix.length; j++) {
                        if (matrix[j][i]) {
                            graphics2D.fillRect(j * 4 + pixoff, i * 4 + pixoff, 4, 4);
                        }
                    }
                }
            } else {
            }
            graphics2D.dispose();
            bufferImgage.flush();
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            ImageIO.write(bufferImgage, "png", output);
            result = output.toByteArray();
            output.close();

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

    public static void saveImage(byte[] data, String fileName,String type) {
        BufferedImage image = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_BYTE_BINARY);
        ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
        try {
            ImageIO.write(image, type, byteOutputStream);
            // byte[] date = byteOutputStream.toByteArray();
            byte[] bytes =  data;
            System.out.println("path:" + fileName);
            RandomAccessFile file = new RandomAccessFile(fileName, "rw");
            file.write(bytes);
            file.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 将二维码中读取出的字节转换成图片
     * @param data
     * @param path
     */
    public static void byte2image(byte[] data,String path){
        if(data.length<3||path.equals("")) return;
        try{
            FileImageOutputStream imageOutput = new FileImageOutputStream(new File(path));
            imageOutput.write(data, 0, data.length);
            imageOutput.close();
        } catch(Exception ex) {
            System.out.println("Exception: " + ex);
            ex.printStackTrace();
        }
    }

    /**
     * 解析二维码(QRCode)
     * @param imgPath 图片路径
     * @return
     */
    public static String decoderQRCode(String imgPath) {
        // QRCode 二维码图片的文件
        File imageFile = new File(imgPath);
        BufferedImage bufImg = null;
        String content = null;
        try {
            bufImg = ImageIO.read(imageFile);
            QRCodeDecoder decoder = new QRCodeDecoder();
            content = new String(decoder.decode(new TwoDimensionCodeImage(bufImg)), "utf-8");
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
            e.printStackTrace();
        } catch (DecodingFailedException dfe) {
            System.out.println("Error: " + dfe.getMessage());
            dfe.printStackTrace();
        }
        return content;
    }

    /**
     * 将指定的图片转换为字节
     * @param path
     * @return
     */
    public static byte[] image2byte(String path){
        byte[] data = null;
        FileImageInputStream input = null;
        try {
            input = new FileImageInputStream(new File(path));
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            byte[] buf = new byte[1024];
            int numBytesRead = 0;
            while ((numBytesRead = input.read(buf)) != -1) {
                output.write(buf, 0, numBytesRead);
            }
            data = output.toByteArray();
            output.close();
            input.close();
        }
        catch (FileNotFoundException ex1) {
            ex1.printStackTrace();
        }
        catch (IOException ex1) {
            ex1.printStackTrace();
        }
        return data;
    }

    public static void main(String[] args) {
        byte[]  imgs=App.createQRCode("d:/2.gif");
        App.saveImage(imgs, "D:/1.png", "png");
        System.out.println(imgs);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        decoderQRCode("D:/1.png");

    }
}

扩展类:

package hbxt;

import jp.sourceforge.qrcode.data.QRCodeImage;

import java.awt.image.BufferedImage;

/**
 * Created by Administrator on 2016-10-20.
 */
public class TwoDimensionCodeImage implements QRCodeImage {
    BufferedImage bufImg;

    public TwoDimensionCodeImage(BufferedImage bufImg) {
        this.bufImg = bufImg;
    }

    @Override
    public int getHeight() {
        return bufImg.getHeight();
    }

    @Override
    public int getPixel(int x, int y) {
        return bufImg.getRGB(x, y);
    }

    @Override
    public int getWidth() {
        return bufImg.getWidth();
    }

}

maven:

<dependency>
      <groupId>com.xiongyingqi</groupId>
      <artifactId>qrcode</artifactId>
      <version>0.1.10</version>
    </dependency>
时间: 2024-08-05 17:55:08

qr 生成二维码的相关文章

使用PHP QR Code生成二维码

HP QR Code是一个PHP二维码生成类库,利用它可以轻松生成二维码,官网提供了下载和多个演示demo,查看地址: http://phpqrcode.sourceforge.net/ 下载官网提供的类库后,只需要使用phpqrcode.php就可以生成二维码了,当然您的PHP环境必须开启支持GD2. phpqrcode.php提供了一个关键的png()方法,其中 参数$text表示生成二位的的信息文本: 参数$outfile表示是否输出二维码图片 文件,默认否: 参数$level表示容错率,

C#利用QrCode.Net生成二维码(Qr码

http://www.cnblogs.com/Soar1991/archive/2012/03/30/2426115.html 现在网上很多应用都是用二维码来分享网址或者其它的信息.尤其在移动领域,二维码更是有很大的应用场景.因为项目的需要,需要在网站中增加一个生成二维码分析网址的功能,在谷歌大幅度抽筋的情况下无奈使用百度.百度N多,找到一些项目,但是可用性不强.(有一个项目是用VS2005开发的,在2010中调试不开.)终于在codeplex上找到一个“神器”,这个“神器”可以很方便的生成二维

PHP通过PHP QR Code生成二维码

1.二维码 二维码 ,又称二维条形码,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的"0"."1"比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理.它具有条码技术的一些共性:每种码制有其特定的字符集:每个字符占有一定的宽度:具有一定的校验功能等.同时还具有对不同行的信息自动识别功能.及处理图形旋转变

C#利用QrCode.Net生成二维码(Qr码)

现在网上很多应用都是用二维码来分享网址或者其它的信息.尤其在移动领域,二维码更是有很大的应用场景.因为项目的需要,需要在网站中增加一个生成二维码分析网址的功能,在谷歌大幅度抽筋的情况下无奈使用百度.百度N多,找到一些项目,但是可用性不强.(有一个项目是用VS2005开发的,在2010中调试不开.)终于在codeplex上找到一个“神器”,这个“神器”可以很方便的生成二维码,速度那是相当的快,并且可支持中文,遵从MIT协议. QrCode.Net是一个使用C#编写的用于生成二维码图片的类库,使用它

Javascript生成二维码(QR)

网络上已经有非常多的二维码编码和解码工具和代码,很多都是服务器端的,也就是说需要一台服务器才能提供二维码的生成.本着对服务器性能的考虑,这种小事情都让服务器去做,感觉对不住服务器,尤其是对于大流量的网站,虽然有服务器端缓存,毕竟需要大量的CPU运算时间,这或多或少也是很大的一块压力.所以就想,有没有一种不靠服务器,就只靠JS就生成二维码呢,毕竟二维码就是一堆黑白点而已.我也没有刻意去找网络上是否已经存在这样的解决方案,而且自己一直想深入分析二维码的生成细节,现有的项目也有这样的需求,于是我自己研

HP QR Code 生成二维码

最近需要做一个扫码登录的功能,通过HP QR Code来实现,HP QR Code是一个开放源代码的php生成二维码的类库 地址:http://phpqrcode.sourceforge.net/ 通过 phpqrcode.php 的png()方法即可生成二维码图片,png()方法参数说明: public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $sav

PHP QR CODE 类库生成二维码

<?php /** * 生成简单的二维码 * 测试已通过 */ // include 'phpqrcode.php'; // QRcode::png('http://www.baidu.com'); // exit; /** * 生成带logo的图片 * */ include 'phpqrcode.php'; $value = 'http://www.baidu.com'; //二维码内容 $errorCorrectionLevel = 'L';//容错级别 $matrixPointSize =

用ABAP 生成二维码 QR Code

除了使用我的这篇blogStep by step to create QRCode in ABAP Webdynpro提到的使用ABAP webdynpro生成二维码之外,也可以通过使用二维码在线生成网站提供的service来生成二维码. 二维码在线生成网站: http://www.makepic.com/qrcode.php 在网页上输入要生成的二维码数据源,校验级别和图片大小,点生成即可看到生成的二维码图片: 下面是用ABAP code 利用上述service生成二维码的代码: DATA:l

微信生成二维码 只需一个网址即刻 还有jquery生成二维码

<div class="orderDetails-info"> <img src="http://qr.topscan.com/api.php?text=http://123.net/index.php?s=/Home/Index/yanzheng/mai/{$dange.id}" style="width: 5rem; margin-bottom: 1rem;" > </div> http://qr.tops