博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java生成微信二维码及logo二维码
阅读量:6963 次
发布时间:2019-06-27

本文共 6053 字,大约阅读时间需要 20 分钟。

依赖jar包

二维码的实现有多种方法,比如 Google 的 zxing 和日本公司的 QrCode,本文以 QrCode 为例。

QrCode.jar:

加入本地 maven

mvn install:install-file -Dfile=QRCode.jar -DgroupId=QRCode -DartifactId=QRCode -Dversion=3.0 -Dpackaging=jar

注意,QrCode 实现的二维码不能很好的支持中文。

实例源码

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;/** * 1、QrCode 生成二维码图片 * 2、生成带有 logo 的二维码图片 * Created by zhengbinMac on 2017/4/27. */public class QrCodeTest {    /**     * 生成二维码 Buffered     * @param content 二维码内容     * @return     */    public static BufferedImage QrcodeImage(String content) {        // 二维码宽度        int width = 140;        // 二维码高度        int height = 140;        try {            Qrcode qrcode = new Qrcode();            // 设置二维码的排错率 'L':7%,'M':15%,'Q':25%,'H':30%            qrcode.setQrcodeErrorCorrect('M');            qrcode.setQrcodeEncodeMode('B');            // 设置二维码的尺寸,尺寸越大,可存储的信息量越大            qrcode.setQrcodeVersion(7);            // 设置图片的尺寸、格式            BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);            // 绘制二维码的图片            Graphics2D graphics2D = bufferedImage.createGraphics();            // 设置背景颜色            graphics2D.setBackground(Color.WHITE);            // 创建二维码的矩形区域            graphics2D.clearRect(0, 0, width, height);            // 设置二维码图片的颜色值            graphics2D.setColor(Color.BLACK);            // 二维码生成点阵的偏移量            int pixoff = 2;            // 获取二维码内容的字节数组,并设置编码            byte[] contentBytes = content.getBytes("UTF-8");            // 输出二维码            if (contentBytes.length > 0 && contentBytes.length < 200) { // 如果二维码内容在规定长度内                boolean[][] codeOut = qrcode.calQrcode(contentBytes);                for (int i = 0;i < codeOut.length;i++) {                    for (int j = 0;j < codeOut.length;j++) {                        if (codeOut[j][i]) {                            graphics2D.fillRect(j*3+pixoff, i*3+pixoff, 3, 3);                        }                    }                }            }            graphics2D.dispose();            bufferedImage.flush();            return bufferedImage;        } catch (Exception e) {            e.printStackTrace();        }        return null;    }    /**     * 在已有的二维码图片加上logo图片     * @param twodimensioncodeImg   二维码图片文件     * @param logoImg               logo图片文件     * @return     */    public static BufferedImage encodeImgLogo(File twodimensioncodeImg,File logoImg){        BufferedImage twodimensioncode = null;        try{            if(!twodimensioncodeImg.isFile() || !logoImg.isFile()){                System.out.println("输入非图片");                return null;            }            //读取二维码图片            twodimensioncode = ImageIO.read(twodimensioncodeImg);            //获取画笔            Graphics2D g = twodimensioncode.createGraphics();            //读取logo图片            BufferedImage logo = ImageIO.read(logoImg);            //设置二维码大小,太大,会覆盖二维码,此处20%            int logoWidth = logo.getWidth(null) > twodimensioncode.getWidth()*3 /10 ? (twodimensioncode.getWidth()*3 /10) : logo.getWidth(null);            int logoHeight = logo.getHeight(null) > twodimensioncode.getHeight()*3 /10 ? (twodimensioncode.getHeight()*3 /10) : logo.getHeight(null);            // 确定二维码的中心位置坐标,设置logo图片放置的位置            int x = (twodimensioncode.getWidth() - logoWidth) / 2;            int y = (twodimensioncode.getHeight() - logoHeight) / 2;            //开始合并绘制图片            g.drawImage(logo, x, y, logoWidth, logoHeight, null);            g.drawRoundRect(x, y, logoWidth, logoHeight, 15 ,15);            //logo边框大小            g.setStroke(new BasicStroke(2));            //logo边框颜色            g.setColor(Color.WHITE);            g.drawRect(x, y, logoWidth, logoHeight);            g.dispose();            logo.flush();            twodimensioncode.flush();        }catch(Exception e){            System.out.println("二维码绘制logo失败");        }        return twodimensioncode;    }    /**     * 生成图片文件     * @param bufferedImage 图片 buffered     * @param imgPath       图片路径     */    public static void writeImage(BufferedImage bufferedImage, String imgPath) {        // 生成二维码的图片        File file = new File(imgPath);        try {            ImageIO.write(bufferedImage, "png", file);        } catch (IOException e) {            e.printStackTrace();        }    }    public static void main(String[] args) {        // 生成二维码        BufferedImage qrCode = QrcodeImage("http://zhengbin.cnblogs.com");        writeImage(qrCode, "/Users/zhengbinMac/Documents/qrcode/qecode2.png");        // 生成带有图片logo的二维码        File qrcode = new File("/Users/zhengbinMac/Documents/qrcode/qecode2.png");        File logo = new File("/Users/zhengbinMac/Documents/qrcode/logo.png");        BufferedImage logoQrcode = encodeImgLogo(qrcode, logo);        writeImage(logoQrcode, "/Users/zhengbinMac/Documents/qrcode/logQrcode.png");    }}

二维码效果

下面打开微信扫一下吧

超链接二维码: 普通文本内容二维码:

注意,超链接前需要加 ' http:// ',否则显示普通文本内容

二维码的解析

/** * 解析二维码 */public static String decodeImg(String imgPath) {    File imgFile = new File(imgPath);    if (imgFile == null) {        return null;    }    BufferedImage bufferedImage;    String content = null;    try {        bufferedImage = ImageIO.read(imgFile);        QRCodeDecoder decoder = new QRCodeDecoder();        // decode 方法入参为 QRCodeImage,其是接口声明,需要实现该接口        content = new String(decoder.decode(new CodeImg(bufferedImage)), "UTF-8");    } catch (IOException e) {        e.printStackTrace();    }    return content;}/** * 实现 QRCodeImage 接口 */static class CodeImg implements QRCodeImage{    private BufferedImage image;    public CodeImg(BufferedImage image) {        super();        this.image = image;    }    @Override    public int getWidth() { return image.getWidth(); }    @Override    public int getHeight() { return image.getHeight(); }    @Override    public int getPixel(int x, int y) { return image.getRGB(x, y); }    public BufferedImage getImage() { return image; }    public void setImage(BufferedImage image) { this.image = image; }}

 

转载地址:http://nywsl.baihongyu.com/

你可能感兴趣的文章
鼠标滑在标题上显示图片的JS代码
查看>>
View Horizon Mirage安装手册(一)——Horizon Mirage介绍
查看>>
Mac OSX 正确地同时安装Python 2.7 和Python3
查看>>
python 爬虫之BeautifulSoup 库的基本使用
查看>>
Linux 文件查找命令详解
查看>>
MySQL中权限管理
查看>>
JavaEE 请求响应
查看>>
如何解决数据文件传输的风险?
查看>>
Hyper-v集群高可用性配置
查看>>
查看域名解析是否生效的方法
查看>>
javax.crypto.spec.SecretKeySpec
查看>>
ubuntu14.04搭建Nginx+php+mysql+phpmyadmin
查看>>
fatal error C1083: 无法打开预编译头文件:“Debug\a.pch”: No su
查看>>
Linux Crontab定时任务
查看>>
ubuntu安装谷歌浏览器
查看>>
崛起于Springboot2.X之mysql读写分离升级版(22)
查看>>
Weblogic数据池测试出错
查看>>
django 迁移数据 暂时禁用auto_now / auto_now_add
查看>>
多个线程之间的通信
查看>>
Tomcat中server.xml文件内各节点详解
查看>>