依赖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. python self

    Python要self的理由 Python的类的方法和普通的函数有一个很明显的区别,在类的方法必须有个额外的第一个参数(self),但在调用这个方法的时候不必为这个参数赋值(显胜于隐的引发). Pyt ...

  2. 关于Object类下所有方法的简单解析

    类Object是类层次结构的根类,是每一个类的父类,所有的对象包括数组,String,Integer等包装类,所以了解Object是很有必要的,话不多说,我们直接来看jdk的源码,开始我们的分析之路 ...

  3. ABP .Net Core API和Angular前端APP集成部署

    前言:在ABP官网(https://aspnetboilerplate.com)生成的.Net Core + Angular项目前后端是两个独立的项目,我们可以分开部署,也可以将前端和Web API一 ...

  4. Ubuntu上安装flashplayer

    当你已经为linux flashplayer无法安装抓狂的时候,不妨来看看吧 我使用的是Ubuntu 12.04.4 LTS,由于firefox无法播放flash所以去下载了一个adobeflashp ...

  5. 【实验手册】使用Visual Studio Code 开发.NET Core应用程序

    .NET Core with Visual Studio Code 目录 概述... 2 先决条件... 2 练习1: 安装和配置.NET Core以及Visual Studio Code 扩展... ...

  6. visual studio 2012打开提示 未能将网站×××配置为使用 ASP.NET 4.5 和 尚未在Web服务器上注册,您需要手动将Web服务器配置为使用ASP.NET 4.5

    未能将网站×××配置为使用 ASP.NET 4.5.为了使此网站正确运行,您必须将它手动配置为使用ASP.NET 4.5. ASP.NET 4.5尚未在Web服务器上注册,您需要手动将Web服务器配置 ...

  7. PHP中静态方法和实例化方法的区别

    在PHP中类为什么要使用静态方法,有什么好处 不需要实例化?? 可以提高运行效率?? 这是一个经常被时时提出来的问题,很多时候我们以为理解了.懂了,但深究一下,我们却发现并不懂. 方法是我们每天都在写 ...

  8. CP342-5做主站的profibus-dp组态应用

    1.CP342-5介绍 2.系统结构图 3.组态DP主站 4.组态DP从站 1)插入DP V0 slaves下的ET200M 2)设置属性 3)添加ET200M的其他模块 4)保存和编译 4.DP通信 ...

  9. 1-安装MQTT服务器(Windows)

    对于不知道MQTT的肯定会问MQTT是干什么的....... 现在我有一个项目需求, 看到这个项目第一想法肯定需要一个服务器,所有的wifi设备和手机都去连接这个服务器,然后服务器进行信息的中转,类似 ...

  10. 程序员的自我救赎---1.4.1:核心框架讲解(DAL)

    <前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...