java实现 二维码生成 并 添加 附加信息

技术标签: Java  java  zxing  二维码  

需求说明
在一些场景中,需要在二维码底部添加一些相关的信息,例如二维码表示一个设备时,下方显示该设备的位置信息
这里写图片描述

实现方式
首先,根据需求的长和宽生成一个BufferedImage

/**
         * 描述:建立布景并设置背景色
         * @author renpengfei
         * @since JDK 1.8
         */
        BufferedImage outputImage = new BufferedImage(DEVICE_QRCODE_WIDTH,DEVICE_IMG_HEIGHT,BufferedImage.TYPE_INT_RGB);
        Graphics g = outputImage.getGraphics();
        g.setColor(Color.WHITE);
        g.fillRect(0,0, DEVICE_QRCODE_WIDTH, DEVICE_IMG_HEIGHT);
        g.dispose();

随后,将二维码本身表达的信息使用 google的zxing生成

        /**
         * 生成二维码
         */
        ErrorCorrectionLevel level = ErrorCorrectionLevel.H;
        HashMap<EncodeHintType,Object> hints = new HashMap<EncodeHintType,Object>();
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
        hints.put(EncodeHintType.ERROR_CORRECTION, level);
        hints.put(EncodeHintType.MARGIN, 0);
        BitMatrix m = new MultiFormatWriter().encode(deviceQrcode, BarcodeFormat.QR_CODE, DEVICE_QRCODE_WIDTH, DEVICE_QRCODE_HEIGHT,hints);
        /**
         * 二维码写入到bufferedImage
        **/
        BufferedImage imageNew = new BufferedImage(DEVICE_QRCODE_WIDTH, DEVICE_QRCODE_HEIGHT,BufferedImage.TYPE_INT_RGB);
        for (int x = 0; x < DEVICE_QRCODE_WIDTH; x++) {
            for (int y = 0; y < DEVICE_QRCODE_HEIGHT; y++) {
                imageNew.setRGB(x, y, m.get(x, y) ? DEVICE_QRCODE_BLACK : DEVICE_QRCODE_WHITE);
            }
        }

然后将二维码写入BufferedImage中:

/**
         * 描述:添加二维码
         */
        int[] imageNewArray = new int[DEVICE_QRCODE_WIDTH*DEVICE_QRCODE_HEIGHT];
        imageNewArray = imageNew.getRGB(0,0,DEVICE_QRCODE_WIDTH,DEVICE_QRCODE_HEIGHT,imageNewArray,0,DEVICE_QRCODE_WIDTH);
        outputImage.setRGB(0,0,DEVICE_QRCODE_WIDTH,DEVICE_QRCODE_HEIGHT,imageNewArray,0,DEVICE_QRCODE_WIDTH);

将所需要的信息写入BufferedImage,这样就得到我们所需要的图片供后续操作,可以下载或者直接显示到页面中。

 Graphics gText = outputImage.createGraphics();
        gText.setColor(Color.black);
        gText.setFont(new Font("普通", Font.PLAIN, DEVICE_INFO_FONT_SIZE));

        gText.drawString(deviceInfo, 0, DEVICE_QRCODE_HEIGHT+DEVICE_INFO_FONT_SIZE);
        gText.dispose();
        return outputImage;

工具类:
http://download.csdn.net/download/qingfengilp/10256996

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qingfengilp/article/details/79360950

智能推荐

Codeforces Gym 100589A Queries on the Tree 树状数组 + 分块_Gatevin的博客-程序员宅基地

题目大意:就是现在对于一棵有向树, 以1为根, 初始的时候每个节点上的硬币数量都是0, 树的结点个数为N 大致思路:首先如果对于每次更新操作用树状数组维护暴力执行的话, 对于同一深度的结点数量很多的时候这个复杂度会达到O(N*M*logN)显然是不能接受的, 那么考虑一下分块的思想首先用时间戳的思想将这棵树映射到一个区间上然后对于每次修改, 当要修改的点数小于sqrt(N)

js实现照片墙效果_路光.的博客-程序员宅基地_js照片墙特效

js实现照片墙效果 &lt;script src="underScore.js"&gt;&lt;/script&gt; &lt;style&gt; *{ margin: 0; padding: 0; border: 0; list-style: none; } html, body,ul{ width: 100%;

记录Android-Studio遇到的各种坑_WilsonXin的博客-程序员宅基地

开此文章,主要是为了记录在使用虐我千百遍,我还待他如初恋的AS的过程中所遇到的各种坑,一来是希望做个记录,方便查找,防止再次踏入同样的坑;二来也希望能帮助到有遇到有跟我相同问题的人。1,首先每次导入一个新的AS工程的时候,肯定会有各种gradle配置问题,只要把build.gradle改为与自己系统相匹配即可,如果报Error:(1, 0) Plugin is too old, p

P4208 [JSOI2008]最小生成树计数_luogu_wbling的博客-程序员宅基地

P4208 [JSOI2008]最小生成树计数#include &lt;bits/stdc++.h&gt;using namespace std;const int maxn = 1e3 + 10;const int mod = 31011;struct Edge { int now, to, val;}edge[maxn];//存边 struct Mintree { int l...

access成绩为非负数_2012年计算机二级Access第二十八套上机试题及答案详解_艺股的博客-程序员宅基地

1.基本操作题在考生文件夹下,存在一个数据库文件“samp1.mdb”,里边已建立两个表对象“tGrade”和“tStudent”,同时还存在一个Excel文件“tCourse.xls”。试按以下操作要求,完成表的编辑:(1)将Excel文件“tCourse.xls”导入到“samp1.mdb”数据库文件中,表名称不变,设“课程编号”字段为主键;(2)对“tGrade”表进行适当的设置,使该表中的...

2021-06-09_Dbxiaohuang的博客-程序员宅基地

1实验目的掌握无线AP的配置要点; 掌握无线带宽路由器的配置要点; 掌握SSID的概念。2实验内容(1)配置无线 LAN 接入(2)将无线路由器添加到网络中(3)配置 Linksys Setup(设置)选项卡中的选项(4)配置 Linksys Wireless(无线)选项卡中的选项(5)配置 Linksys Administration(管理)选项卡中的选项(6)为 PC 添加无线连接(7)测试连通性3 实验仪器设备路由器2台; 交换机1台; PC机3台; Cisco

随便推点

自定义Flask项目组织框架_也无渢雨也无晴的博客-程序员宅基地

自定义Flask项目组织框架不同于大多数其他的 Web 框架,Flask 并不强制要求大型项目使用特定的组织方式,程序结构的组织方式完全由开发者决定。在此我记录一种使用包和模块组织大型程序的方式。框架一览重要文件说明文件说明顺序为目录由上至下。蓝图文件(apps\index\init.py)from flask import Blueprintindex_bp = Blueprint('index', __name__, template_folder=='index')#

子窗口切换java应用中的子窗口切换,引出抽象类与接口的本质区别_weixin_30532369的博客-程序员宅基地

时间紧张,先记一笔,后续优化与完善。 今天一同窗问我,如何在一个java应用窗口(JFrame)中切换其内的子窗口(JInternalFrame)。 我想了一下,因为全部的子窗口都可以说是有独特特性的对象,觉得用抽象类来代表一个最原始的子窗口类,并在这个抽象类中建立一个方法专门来担任窗口切换,全部继承它的子窗口都可以用到这个方法来实现切换功能。...

IPS简单使用方法_weixin_33905756的博客-程序员宅基地

转载:http://blog.csdn.net/zhou1862324/article/details/17512191IPS(incident packaging service)是11G的新特性,其目的是查看某个错误相关的所有dump文件和trace文件,并可以很方便的打成一个包,我认为这个特性极大的方便了DBA进行远程诊断。PRE:使用前首先设置好ORACLE_HOME和PATH环境变量...

poj 1151 && hdu 1542_liurui39660的博客-程序员宅基地

题目概述给定N个矩形左下角和右上角顶点的坐标,求其面积并 矩形的边一定与坐标轴平行或垂直时限1000ms/3000ms输入第一行正整数N,其后N行,每行四个浮点数,代表两个顶点的坐标,输入到N=0结束限制1<=N<=100;0<=坐标值<=100000输出每组数据输出在两行中,第一行 Test case #A 其中A为数据序数,从1开始,第二行 Total explored area: B

ElasticSearch集群配置密码认证_水彩橘子的博客-程序员宅基地_elasticsearch集群设置密码

1、环境介绍操作系统:centos 7.9elasticsearch版本:7.13.32、生成es ca证书bin/elasticsearch-certutil ca注意:提示输入密码:输入Smtgbk_123(自定义,后面配置文件中用到)3、生成p12秘钥bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12注意:提示输入密码:输入Smtgbk_123(自定义,后面配置文件中用到)4、创建秘钥目录,并把秘钥放到里面m

安卓两个坐标系_qq_46532496的博客-程序员宅基地

一Android坐标系:Android坐标系将屏幕的左上角的顶点作为Android坐标系的原点,向右为X轴的正方向,向下是Y轴的正方向。在触控事件中getRawX()和getRawY()获得的坐标也是Android坐标系的坐标。二View坐标系1自身坐标以下方法获得View到父控件的距离getTop() :获取View自身顶边到父布局顶边的距离:getLeft():获取View自身左边到其父布局左边的距离;getRight()...

推荐文章

热门文章

相关标签