准备:生成带logo的二维码时,logo图片必须存在;不存在则生成无logo的二维码。

1、建立Maven项目,并引入jar包。

<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.2.0</version>
</dependency>
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>3.2.0</version>
</dependency>

2、编码

import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Shape;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;import javax.imageio.ImageIO;import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageConfig;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;public class QRCode {private static final String CHARSET = "utf-8";private static final String FORMAT_NAME = "png";// 二维码尺寸private static final int QRCODE_SIZE = 300;// LOGO宽度private static final int WIDTH = 60;// LOGO高度private static final int HEIGHT = 60;public static String decode(String path) throws Exception {  return QRCode.decode(new File(path));  }  /*** 从二维码中解析数据 * @param file 二维码图片文件* @return    返回从二维码中解析到的数据值 * @throws Exception* @author wanmm* @date 2017年9月12日*/public static String decode(File file) throws Exception{BufferedImage image = ImageIO.read(file);//图片缓存对象if(image ==null)return null;BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);//BinaryBitmap 解码二进制位图BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));/* Hashtable hints = new Hashtable();  可用下面的Map对象替换*/Map<DecodeHintType,Object> hints = new HashMap<DecodeHintType,Object>();//设置字符串解码格式hints.put(DecodeHintType.CHARACTER_SET, CHARSET);//Result封装在图像中的解码结果Result result = new MultiFormatReader().decode(bitmap, hints);return result.getText();}/*** 生成带logo二维码,并保存到磁盘中* @param content    二维码内容* @param imgPath    二维码中插入的logo的图片路径* @param destPath    目标路径* @param needCompress 是否压缩logo的大小* @throws Exception* @author wanmm* @date 2017年9月12日*/public static void encode(String content,String imgPath,String destPath,boolean needCompress) throws Exception{BufferedImage image = QRCode.createImage(content, imgPath, needCompress);mkdirs(destPath);String file = new Random().nextInt(99999999) + ".png";//生成随机文件名  ImageIO.write(image, FORMAT_NAME, new File(destPath + "/" + file));  }public static void mkdirs(String destPath){File file = new File(destPath);if(!file.exists() && !file.isDirectory()){file.mkdirs();}}/*** 生成二维码* @param contend    二维码内容* @param imgPath    二维码中插入的logo的图片路径* @param needCompress    是否压缩logo的大小* @return    二维码图片* @throws Exception* @author wanmm* @date 2017年9月12日*/public static BufferedImage createImage(String content,String imgPath,boolean needCompress) throws Exception{Map<EncodeHintType,Object> hints = new HashMap<EncodeHintType,Object>();//纠错程度hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);//字符编码hints.put(EncodeHintType.CHARACTER_SET, CHARSET);//生成条形码时使用的空白值。单位:像素hints.put(EncodeHintType.MARGIN, 1);//二维码的描述对象BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,hints);/*int width = bitMatrix.getWidth();int height = bitMatrix.getHeight();BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);for(int x =0;x<width;x++){for(int y=0;y<height;y++){//bitMatrix.get获取所请求的点image.setRGB(x, y, bitMatrix.get(x, y)? 0xFF000000 : 0xFFFFFFFF);}}*/MatrixToImageConfig config = new MatrixToImageConfig(0xFF000001, 0xFFFFFFFF);BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix, config);if(imgPath == null || "".equals(imgPath)){return image;}//二维码中加入logoQRCode.insertImage(image, imgPath, needCompress);return image;}/*** 在生成的二维码中插入logo图片* @param source  二维码图片* @param imgPath logo路径* @param needCompress 是否压缩logo的大小* @throws Exception* @author wanmm* @date 2017年9月12日*/private static void insertImage(BufferedImage source,String imgPath,boolean needCompress) throws Exception{File file = new File(imgPath);if(!file.exists()){System.err.println(imgPath+" 该文件不存在");return;}Image logoImg = ImageIO.read(file);int width = logoImg.getWidth(null);int height = logoImg.getHeight(null);if(needCompress){if(width > WIDTH)width = WIDTH;if(height > HEIGHT)height = HEIGHT;//创建压缩图像Image img = logoImg.getScaledInstance(width, height, Image.SCALE_SMOOTH);BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 绘制缩小后的图  Graphics g = tag.getGraphics();g.drawImage(img, 0, 0, null);g.dispose();logoImg = img;}//插入logo图片Graphics2D graph = source.createGraphics();// 计算图片放置位置int x = (QRCODE_SIZE-width)/2;int y = (QRCODE_SIZE-height)/2;graph.drawImage(logoImg, x, y, width, height, null);Shape shape = new RoundRectangle2D.Float(x, y, width, height, 6, 6);//设置图形画线的宽度为3graph.setStroke(new BasicStroke(3f));graph.draw(shape);graph.dispose();}public static void encode(String content, String imgPath, String destPath) throws Exception {  QRCode.encode(content, imgPath, destPath, false);  }  public static void encode(String content, String destPath, boolean needCompress) throws Exception {  QRCode.encode(content, null, destPath, needCompress);  }  public static void encode(String content, String destPath) throws Exception {  QRCode.encode(content, null, destPath, false);  }
}

3 测试

 public static void main(String[] args) throws Exception {  //生成带logo 的二维码   String text = "http://www.csdn.net/";  QRCode.encode(text, "d:/img/tximg.png", "d:/img", true);  //生成不带logo 的二维码  String textt = "http://www.baidu.com";  QRCode.encode(textt,"","d:/img",true);  //指定二维码图片,解析返回数据  System.out.println(QRCodeUtil.decode("D:/img/61679114.png"));  }

Java 将文本内容、网址 ;生成二维码 解析二维码相关推荐

  1. 【深度学习模型】智云视图中文车牌识别源码解析(二)

    [深度学习模型]智云视图中文车牌识别源码解析(二) 感受 HyperLPR可以识别多种中文车牌包括白牌,新能源车牌,使馆车牌,教练车牌,武警车牌等. 代码不可谓不混乱(别忘了这是职业公司的准产品级代码 ...

  2. Java 富文本内容转化word导出

    一.需求: 当创建使用富文本编辑器,操作完的数据,传输到后台都是带有html标签的. 如:<h1>标题头</h1><h2>第二个标题</h2><a ...

  3. Java对文本内容进行排序

    练习 对文本的内容进行排序按照(1,2,3....)顺序 文本<出师表>:3.侍中.侍郎郭攸之.费祎.董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下.愚以为宫中之事,事无大小,悉以咨之, ...

  4. Java调用百度短网址生成短链接

    1. 方式一 直接在线生成 https://dwz.cn/ 2. 方式二 调用接口生成 引入gson-2.8.5.jar 可以通过maven仓库搜索下载地址 http://central.maven. ...

  5. Java追加文本内容到txt文件

      文本内容逐行写入到txt文件中: import java.io.RandomAccessFile;/*** 功能:将内容逐行写入到txt文件中* @param fileName 文件名(绝对路径) ...

  6. 【Vue.js源码解析 二】-- 虚拟 DOM

    前言 笔记来源:拉勾教育 大前端高薪训练营 阅读建议:建议通过左侧导航栏进行阅读 虚拟 DOM 基本介绍 什么是虚拟 DOM 虚拟 DOM(Virtual DOM) 是使用 JavaScript 对象 ...

  7. Kubernetes学习笔记之Calico CNI Plugin源码解析(二)

    女主宣言 今天小编继续为大家分享Kubernetes Calico CNI Plugin学习笔记,希望能对大家有所帮助. PS:丰富的一线技术.多元化的表现形式,尽在"360云计算" ...

  8. Mobx 源码解析 二(autorun)

    前言 我们在Mobx 源码解析 一(observable)已经知道了observable 做的事情了, 但是我们的还是没有讲解明白在我们的Demo中,我们在Button 的Click 事件中只是对ba ...

  9. android网络框架retrofit源码解析二

    注:源码解析文章参考了该博客:http://www.2cto.com/kf/201405/305248.html 前一篇文章讲解了retrofit的annotation,既然定义了,那么就应该有解析的 ...

最新文章

  1. 女友让我破解植物大战僵尸!我干脆撸了一款一样的....翻身舔狗把歌唱呀
  2. QT精彩实例分析第5章-0
  3. Beta冲刺 (2/7)
  4. php 重新编译_linux下为php添加GD库(重新编译php)
  5. 都9012了,这几个公众号你还没关注?
  6. 本田与索尼宣布将成立合资企业 计划2025年开始销售电动汽车
  7. The requested URL /xxxx.html was not found on this server
  8. 关于N82后摄像头拍照无法启动的超强技术解决方案
  9. Vue webapp项目通过HBulider打包原生APP
  10. 中兴新支点操作系统挺好用的,国内电脑应预装国产操作系统
  11. 安卓手机上超好用的4款C语言IDE(附下载地址)
  12. Android检测wifi信号强度,检测网络是否通畅
  13. RFID技术实现汽车零部件与EDI自动连接
  14. vscode下golang build tags
  15. 广告联盟,拿什么拯救博客?
  16. xss靶场练习之xss.haozi.me解析及答案
  17. iphone怎么迁移数据_如何将数据从旧iPhone迁移到新iPhone
  18. 电视机与计算机共享,终于实现电视与电脑共享了!与大家分享!
  19. Acwing1123. 铲雪车(欧拉回路)
  20. 华为p20何时升级成鸿蒙,华为P20用户须知!EMUI 9.1 正式推送更新

热门文章

  1. c语言课程设计错误总结,c语言课程设计项目遇到的问题总结
  2. MySQL健康检查(一)
  3. html三栏式布局图,div布局的自由伸展三栏式版面
  4. 测试学习打卡第一天——测试与开发模型基本介绍
  5. dear pygui ver_1.0.2【中文字体、创建窗口】
  6. 汉莎澄清未禁止苹果AirTag用于行李托运,行李防丢可用伦茨Find My
  7. 小鸡模拟器android怎么玩,安卓小鸡模拟器运行总结~
  8. 12个体育运动LUTs调色预设包
  9. Go报错Finished running tool: 路径,current directory outside main module .... dependencies 的解决方法
  10. 洗脑有术:如何防止被洗脑?