依赖jar包

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

QrCode.jar:https://pan.baidu.com/s/1c1PYV0s

加入本地 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; }
}

Java生成微信二维码及logo二维码的更多相关文章

  1. java 生成微信的二维码 工具类

    package com.app.wii.util; import java.io.File;import java.io.FileInputStream;import java.io.FileOutp ...

  2. vue生成条形码/二维码/带logo二维码

    条形码:https://blog.csdn.net/dakache11/article/details/83749410 //安装 cnpm install @xkeshi/vue-barcode / ...

  3. Java生成微信分享海报【基础设计】

    前言 微信后台生成海报一般都是一个模板写死,然后就完事了,过了不久让修改个模板,就又要看半天,还要考虑是否重新复制一份改一改,越来越多的重复代码,全在一个图片类里,然后就越来越乱.这两天用设计模式处理 ...

  4. java 生成二维码、可带LOGO、可去白边

      1.准备工作 所需jar包: JDK 1.6: commons-codec-1.11.jar core-2.2.jar javase-2.2.jar JDK 1.7: commons-codec- ...

  5. java 生成二维码后叠加LOGO并转换成base64

      1.代码 见文末推荐 2.测试 测试1:生成base64码 public static void main(String[] args) throws Exception { String dat ...

  6. 【java】google的zxing架包生成二维码和读取二维码【可带文字和logo】

    承接RC4生成不重复字符串的需求之后,因为优惠码要方便用户使用的缘故,所以思来想去,觉得还是直接生成二维码给用户直接扫比较实用,也不用用户专门记录冗长的优惠码编号. ================= ...

  7. Java生成带logo 的二维码

    这个工具类主要实现了两点功能: 1. 生成任意文链接的二维码. 2. 在二维码的中间加入图像. 主要实现步骤: 第一步: 导入QR二维码3.0 版本的core包和一张jpg图片(logo). core ...

  8. QRCode 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式

    目录 功能介绍 常见问题 效果图与示例 apk Gradle 依赖 布局文件 自定义属性说明 接口说明 关于我 功能介绍 根据之前公司的产品需求,参考 barcodescanner 改的,希望能帮助到 ...

  9. Java生成名片式的二维码源码分享

    世界上25%的人都有拖延症——但我觉得这统计肯定少了,至少我就是一名拖延症患者.一直想把“Java生成名片式(带有背景图片.用户网络头像.用户昵称)的二维码”这篇博客分享出来,但一直拖啊拖,拖到现在, ...

随机推荐

  1. 自学Zabbix3.10.1-事件通知Notifications upon events-媒介类型

    自学Zabbix3.10-事件通知Notifications upon events-媒介类型 zabbix触发器到了要发送通知的情况下,需要一个中间介质来接收并传递它的消息给运维们,以往用nagio ...

  2. 自学Zabbix3.8.2-可视化Visualisation-maps网络地图

    自学Zabbix3.8.2-可视化Visualisation-maps网络地图 可以简单的理解为动态网络拓扑图,可以针对业务来配置zabbix map,通过map可以了解应用的整体状况:服务器是否异常 ...

  3. 自学Zabbix3.5.1-监控项item-key详解

    自学Zabbix3.5.1-监控项item-key详解个人觉得艰难理解,故附上原文档:https://www.zabbix.com/documentation/3.0/manual/config/it ...

  4. redis的sort命令

    1.简单描述 sort命令可以对list.set和sorted set的元素进行排序,然后显示排序的结果,不影响这些类型里面存储的数据的排序.就是说sort可以对list的元素排序,但是执行lrang ...

  5. selenium.common.exceptions.WebDriverException: Message: 'phantomjs' executab

    该问题博主是在Mac环境遇到的,对应windows找对应解决方案解决即可. 问题原因: phantomjs环境配置有问题,要么是配置错误,要么是没有配置. 解决方案: 1.将下载解压好的phantom ...

  6. gulp实现公共html代码复用

    在开发网站的时候,尤其是类似于官网这样的项目,顶部都会有一个导航栏,底部会有一些其他信息,而这两个部分在每一个页面都是有的.我们不可能在每个html页面都写一遍,这样也不便后期维护等操作,所以可以把顶 ...

  7. 数据分析与展示——Matplotlib基础绘图函数示例

    Matplotlib库入门 Matplotlib基础绘图函数示例 pyplot基础图表函数概述 函数 说明 plt.plot(x,y,fmt, ...) 绘制一个坐标图 plt.boxplot(dat ...

  8. 关于html,css,js三者的加载顺序问题

    <head lang="en"> <meta charset="utf-8"> <title></title> ...

  9. Collection源码图

    java基础是否扎实,在于多读源码,比如集合 IO Socket 多线程并发包等 最近将集合框架的源码读了以下,总结了一些,下图所示

  10. 微信公众号开发——通过ffmpeg解决amr文件无法播放问题

    今天刚好碰到个需求,要在微信浏览器中实现录音,并在其他页面上播放.录音功能本身是JS SDK的功能,倒没啥问题,然而录音的文件保存下来是amr格式,而IOS的浏览器没法播放amr(据说微信浏览器的vi ...