最近客户抽筋了,不想要我们现有的二维码,转而采用二维条码。(这之前二维码也不是我做的)既然是甲方bb提出的,老板又安排到到我手上了,那么我就得心(一)甘(脸)情(苦)愿(逼)的默默解决呗。

二维码/二维条码介绍:http://www.systron.com.cn/2.htm
一维条码与二维条码区别:https://jingyan.baidu.com/article/7f766daf45f29d4100e1d079.html

JAVA版

效果图:


依赖jar:链接:https://pan.baidu.com/s/1vMXbaU_JslF33U5fY-MaxQ 提取码:27jh

import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;/*** @program: gzga0912* @description: 二维码工具* @author: cc2018* @create: 2019-10-21 10:38**/
public class QRCodeUtil {public static final String DIVISION="#";private static final String CHARSET = "utf-8";private static final String FORMAT_NAME = "JPG";private static final Integer POINTCOLOR = 0x00000000;private static final Integer QRBACKCOLOR = 0xFFFFFFFF;private static final int QRCODE_SIZE = 300;// 二维码尺寸private static final int LOGO_WIDTH = 60;  // logo宽度private static final int LOGO_HEIGHT = 60; // logo高度/*** 生成二维码图片流* @param content 二维码内容* @param imgPath 二维码中插入的图片* @param insertLogoCompress 插入logo是否压缩* @return 返回图片流程* @throws Exception*/private static BufferedImage createImage(String content, String imgPath, boolean insertLogoCompress) throws Exception {BufferedImage image = createImage(content);if (imgPath == null || "".equals(imgPath)) { return image;}// 插入图片QRCodeUtil.insertImage(image, imgPath, insertLogoCompress);return image;}/*** 生成二维码* @param content 二维码内容* @return 返回二维码图片流* @throws Exception*/private static BufferedImage createImage(String content) throws Exception{Hashtable hints = new Hashtable();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,//条形码格式  QR_CODE二维码  PDF_417条形码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++) {image.setRGB(x, y, bitMatrix.get(x, y) ? POINTCOLOR : QRBACKCOLOR);}}return image;}/*** 插入图片到二维码中* @param source* @param imgPath 插入二维码中的图片* @param insertLogoCompress 是否需要压缩插入的图片* @throws Exception*/private static void insertImage(BufferedImage source, String imgPath, boolean insertLogoCompress) throws Exception {File file = new File(imgPath);if (!file.exists()) {System.err.println("" + imgPath + "   该文件不存在!");return;}//提供read()和write()静态方法,读写图片Image src = ImageIO.read(new File(imgPath));//读取需要插入的文件为图片类型int width = src.getWidth(null);//获取插入的图片宽度int height = src.getHeight(null);//获取插入的图片高度if (insertLogoCompress) { // 压缩LOGOif (width > LOGO_WIDTH) {width = LOGO_WIDTH; }if (height > LOGO_HEIGHT) {height = LOGO_HEIGHT;}Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics g = tag.getGraphics();g.drawImage(image, 0, 0, null); // 绘制缩小后的图g.dispose();src = image;}// 插入LOGOGraphics2D graph = source.createGraphics();//在二维码流中插入logoint startX = (QRCODE_SIZE - width) / 2;//logo插入startX起始坐标  width结束x坐标int startY = (QRCODE_SIZE - height) / 2;//logo插入startY起始坐标 height结束y坐标graph.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.4f));// 1.0f为透明度 ,值从0-1.0,依次变得不透明graph.drawImage(src, startX, startY, width, height, null);graph.setStroke(new BasicStroke(1f));//设置线条宽度Shape shape = new RoundRectangle2D.Float(startX, startY, width, height, 6, 6);graph.draw(shape);graph.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));//结束透明设置graph.dispose();}/*** 生成二维码* @param content 二维码内容* @param imgPath 二维码插入图片* @param destPath 二维码生成存放路径* @param insertLogoCompress 是否需要压缩插入的图片* @throws Exception*/public static void encode(String content, String imgPath, String destPath, boolean insertLogoCompress) throws Exception {BufferedImage image = QRCodeUtil.createImage(content, imgPath, insertLogoCompress);mkdirs(destPath);ImageIO.write(image, FORMAT_NAME, new File(destPath));}public static void encode(String content, String destPath) throws Exception {BufferedImage image = QRCodeUtil.createImage(content);mkdirs(destPath);ImageIO.write(image, FORMAT_NAME, new File(destPath));}public static void encode(Map<String, String> content, String destPath) throws Exception {BufferedImage image = QRCodeUtil.createImage(getStrByMap(content));mkdirs(destPath);ImageIO.write(image, FORMAT_NAME, new File(destPath));}/*** 通过给定的路径生成文件* @param destPath*/public static void mkdirs(String destPath) {File file = new File(destPath);// 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)if (!file.exists() && !file.isDirectory()) {file.mkdirs();}}/*** 解析二维码* @param file 二维码文件* @return 返回二维码得到的字符串结果集* @throws Exception*/public static String decode(File file) throws Exception {BufferedImage image;image = ImageIO.read(file);if (image == null) {return null;}BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));Result result;Hashtable hints = new Hashtable();hints.put(DecodeHintType.CHARACTER_SET, CHARSET);result = new MultiFormatReader().decode(bitmap, hints);String resultStr = result.getText();return resultStr;}/*** 解析二维码* @param path 二维码路径* @return* @throws Exception*/public static String decode(String path) throws Exception {return QRCodeUtil.decode(new File(path));}public static void main(String[] args) throws Exception {// 存放在二维码中的内容Map<String, String> map = new HashMap<>();map.put("name", "cc百川");map.put("data", "2019-10-25");// 嵌入二维码的图片路径String imgPath = "D:/qc/sourceimg/1.jpg";// 生成的二维码的路径及名称String destPath = "D:/qc/cctest1021.jpg";//生成二维码QRCodeUtil.encode(getStrByMap(map), imgPath, destPath, true);
//        QRCodeUtil.encode(map, destPath);// 解析二维码String str = QRCodeUtil.decode(destPath);String [] returns = str.split(QRCodeUtil.DIVISION);System.out.println(Arrays.toString(returns));// 打印出解析出的内容System.out.println(str);}public static String getStrByMap(Map<String, String> data) {String str = "";if(data == null || data.isEmpty()) return str;for(Map.Entry<String, String> ent : data.entrySet()){str += ent.getKey()+"="+ent.getValue() +DIVISION;}return str;}}

注意点:

1.设置背景透明

Graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.4f));// 1.0f为透明度 ,值从0-1.0,依次变得不透明
xxxx
Graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));//结束透明设置

2.设置二维码图片中插入logo

Graphics2D graph = source.createGraphics();//source二维码流
Image src = ImageIO.read(new File(imgPath));//读取需要插入的文件为图片类型
graph.drawImage(src, startX, startY, width, height, null);
xxx

3.插入边框

     graph.setStroke(new BasicStroke(1f));//设置线条宽度Shape shape = new RoundRectangle2D.Float(startX, startY, width, height, 6, 6);graph.draw(shape)

4.二维码点整颜色设置

         BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//带缓冲区  图像类for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {image.setRGB(x, y, bitMatrix.get(x, y) ? 0x00000000: 0xFF00FFFF);}}

5.设置二维码扫描后直接跳转路径

内容直接写你想要跳转后的路径
 BitMatrix bitMatrix = new MultiFormatWriter().encode("http://www.baidu.com",BarcodeFormat.QR_CODE,//条形码格式  QR_CODE二维码  PDF_417条形码QRCODE_SIZE,//条码宽度QRCODE_SIZE,//条码高度hints//条码其他参数);

6.生成二维条码

BitMatrix bitMatrix = new MultiFormatWriter().encode(content,BarcodeFormat.PDF_417,//条形码格式  QR_CODE二维码  PDF_417条形码QRCODE_SIZE,//条码宽度QRCODE_SIZE,//条码高度hints//条码其他参数);

7.解码,利用MultiFormatReader类

         Result result;Hashtable hints = new Hashtable();hints.put(DecodeHintType.CHARACTER_SET, CHARSET);result = new MultiFormatReader().decode(bitmap, hints);

畅想:我们就可以利用二维码扫码登录了,我想的方案是利用WebSocket进行双工通信,或者利用Redis发布订阅。

以上是本周开发中稍微有趣的东西,望大家多多指教。

分享6:绘制二维码/二维条码(java版)相关推荐

  1. java 二维码原理以及用java实现的二维码的生成、解码

    QR码生成原理(一) 一.什么是QR码 QR码属于矩阵式二维码中的一个种类,由DENSO(日本电装)公司开发,由JIS和ISO将其标准化.QR码的样子其实在很多场合已经能够被看到了,我这还是贴个图展示 ...

  2. java生成二维码到文件,java生成二维码转成BASE64

    java生成二维码到文件,java生成二维码转成BASE64 如题,利用java和第三方库,把指定的字符串生成二维码,并且把二维码保存成图片,转换成BASE64格式. 需要的jar文件: packag ...

  3. python之有趣的二维码-----二维码表白记

    " 如何使用二维码进行表白-一键制作二维码" 二维码在我们现在生活中随处可见,因为一次突发奇想,那我们可不可以制作一个自己的二维码呢!然后让女朋友去扫描一下----嘿嘿嘿--不行, ...

  4. PHP批量生成底部带编号二维码(二维码生成+文字生成图片+图片拼接合并)

    PHP批量生成带底部编号二维码(二维码生成+文字生成图片+图片拼接合并) 需求: 输入编号如 : cb05-0000001  至 cb05-0000500 批量生成 以编号为名称的下图二维码,然后压缩 ...

  5. Swift开发小技巧--扫描二维码,二维码的描边与锁定,设置扫描范围,二维码的生成(高清,无码,你懂得!)...

    二维码的扫描,二维码的锁定与描边,二维码的扫描范围,二维码的生成(高清,无码,你懂得!),识别相册中的二维码 扫描二维码用到的三个重要对象的关系,如图: 1.懒加载各种类 // MARK: - 懒加载 ...

  6. 带参数的公众号二维码 生成+后台拦截java

    获取公众号的二维码的ticket 我是用的永久的二维码获取方式 这里的scene_id不能重复,生成的二维码才不一样 public String getGZHCodeByPubKey(String s ...

  7. 灵猫二维码 - 二维码中间加图片的方法

    正常生成的二维码都是不带图标的,但是很多时候我们都需要在二维码中间添加上我们自己的图标,这个时候我们就可以使用灵猫二维码来进行操作了! 使用教程: 1.打开灵猫二维码:http://lmewm.mai ...

  8. 微信二维码的生成(java后端)--邀请新人

    目录 写在前言 1.微信官方文档 2.具体分析 写在前言 最近因为在学习微信小程序邀请新用户的功能,所以需要后端生成二维码并且携带本人的用户id或者其他的信息,传给前端.用户通过这个二维码去进行登录或 ...

  9. vue 在线生成二维码 二维码生成背景下载

    安装 引用 3.注入 app.vue 这里只是生成二维码 生成二维码 js 这里是需要二维码 并且与另一张合成一张image的! 上代码

最新文章

  1. phpgif图片包_PHP生成GIF动态图片验证码
  2. Ajax_jquery库中Ajax方法的使用
  3. php自动发卡程序8.0_php自动发卡平台源码
  4. Gaussview保存文件时,对话框一直弹不出来的原因
  5. c语言编写在线考试系统,c语言作业在线考试系统实现
  6. java实现京东登陆界面_java实现京东云第三方登录
  7. IO、NIO和Netty
  8. 晶振的匹配电容计算公式
  9. Jlink-V9虚拟串口接口(JTAG、SWD、TTL)
  10. SIMULINK模型自动生成Verilog代码
  11. SystemVerilog芯片验证 SV语言部分(一)
  12. 爬取B站视频 - m4s文件的相关研究
  13. SRAM随机存储器的特点及结构
  14. 埃尔米特函数的计算(C++)
  15. No mapping found for HTTP request with URI问题解决
  16. Swiper Social项目(一): Swiper Social项⽬概览及项⽬⽬标(类似于探探)
  17. OpenNI的安装与开发环境配置
  18. HTTPS是什么幺蛾子
  19. 奥运上最幸福的失意人-劳伦杰克逊
  20. android通讯录demo

热门文章

  1. 教育部原副部长:大学千篇一律 需个性化
  2. 紫外线杀菌装置:飞利浦紫外线杀菌灯TUV55W
  3. vee-validate 内置的校验规则
  4. 一加 11是双卡双待吗 一加 11拍照性能怎么样
  5. Microsoft Office 2003 遇到错误 总是出现需要以安全模式重启
  6. ACM封榜滚榜技术记录(qduoj)
  7. SAP中负库存的相关设定
  8. Java Poi 读取 Excel2007 自定义属性
  9. 支持向量机:PRML:SparseKernelMachine
  10. Java:用类求圆的面积和周长