依赖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. springboot整合mybatis使用阿里(阿里连接池)和xml方式

    源码地址:https://github.com/wuhongpu/springboot-mybatis.git 1.在pom文件中引入相关依赖包 <?xml version="1.0& ...

  2. python集合增删改查,深拷贝浅拷贝

    集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系 ...

  3. Python 项目实践二(生成数据)第一篇

    上面那个小游戏教程写不下去了,以后再写吧,今天学点新东西,了解的越多,发现python越强大啊! 数据可视化指的是通过可视化表示来探索数据,它与数据挖掘紧密相关,而数据挖掘指的是使用代码来探索数据集的 ...

  4. 【CSS3】字体font

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. Ionic2 cordova angular2 打包到Android apk环境搭建

    一.前言 前段时间,公司有个APP项目需要支持不同平台,于是采用了Ionic2 + cordova + angular2,在搭建环境过程中遇到了不少问题,刚好最近有时间整理出来. 二.开发环境搭建 参 ...

  6. linux下增加磁盘改变指定文件路径分区挂载点和迁移数据

    Centos7 系统上原有目录/data 挂载根目录下,空间有点小,我们需要把/data目录挂载到另一个磁盘,同时把数据迁移. 1.查看分区情况 fdisk -l 2.查看路径对应分区情况 df -l ...

  7. Simple Games Using SpriteKit

    p.p1 { margin: 0.0px 0.0px 12.0px 0.0px; line-height: 14.0px; font: 12.0px Times; color: #000000 } s ...

  8. 命令行执行php脚本 中$argv和$argc

    在实际工作中有可能会碰到需要在nginx命令行执行php脚本的时候,当然你可以去配置一个conf用外网访问. 在nginx命令行中 使用 php index.php 就可以执行这个index.php脚 ...

  9. ArcGIS API for JavaScript 4.2学习笔记[19] 搜索小部件——使用更多数据源

    上一篇中提到,空间搜索小部件是Search这个类的实例化,作为视图的ui属性添加进去后,视图就会出现搜索框了. 这节的主体代码和上篇几乎一致,区别就在上篇提及的sources属性. 先看看结果: 由于 ...

  10. ioutil包二

    ioutil包二 (原创随笔,转载请注明出处 http://www.cnblogs.com/majianguo/p/8016426.html) ioutil包实现了一些I/O实用功能,导出了7个函数和 ...