zxing生成二维码带logo、zxing生成二维码带图片_com.google.zxing.client.j2se.matrixtoimagewriter.t-程序员宅基地

技术标签: 二维码加图片  随手记  zxing  

package com.example.springbootdemo.tt;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

import javax.imageio.ImageIO;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Map;

public class T9 {

    public static void main(String[] args) throws Exception {

        /**
         * 步骤
         * 1、zxing生成二维码的bufferimage
         * 2、取出logo后缩小为二维码bufferimage的5倍并切圆角
         * 3、创建一个新的bufferimage把二维码的buffer和缩小后的logo的buffer绘画即可
         */

        String content  = "hello";// 内容
        int width = 500;// 宽
        int height = 500;// 高

        Map<EncodeHintType, String> hints = new HashMap<>();
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        hints.put(EncodeHintType.MARGIN, "0");// 内边距

        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        BitMatrix bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, width, height, hints);
        BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix);// 二维码BufferedImage

        BufferedImage logo = ImageIO.read(new File("F:" + File.separator + "Z.PNG"));// 原logo图
        // 缩小5倍
        BufferedImage compressImage = new BufferedImage(bufferedImage.getWidth() / 5,bufferedImage.getHeight() / 5, BufferedImage.TYPE_INT_ARGB);
        Graphics2D logoGraphics = (Graphics2D) compressImage.getGraphics();
        logoGraphics.setBackground(Color.WHITE);

        // 切圆角 start
        logoGraphics.setComposite(AlphaComposite.Src);
        logoGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        logoGraphics.setColor(Color.WHITE);
        logoGraphics.fill(new RoundRectangle2D.Float(0, 0, compressImage.getWidth(), compressImage.getHeight(), 30, 30));// 核心:30是圆角的大小
        logoGraphics.setComposite(AlphaComposite.SrcAtop);
        // 切圆角 end

        /*
        一个圆
        Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, compressImage.getWidth(), compressImage.getHeight());
        logoGraphics.setClip(shape);*/

        logoGraphics.drawImage(logo, 0,0,compressImage.getWidth(), compressImage.getHeight(),null);
        logoGraphics.dispose();// 完成缩小

        // 新的bufferedImage1,分别装二维码buffer和缩小后的Logo的buffer
        BufferedImage bufferedImage1 = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = (Graphics2D) bufferedImage1.getGraphics();

        int x = (bufferedImage.getWidth() - compressImage.getWidth()) / 2;// 缩小后的logo位置的x坐标
        int y = (bufferedImage.getHeight() - compressImage.getHeight()) / 2;// 缩小后的logo位置的y坐标

        g.drawImage(bufferedImage, 0, 0, null);
        g.drawImage(compressImage, x, y, null);
        g.dispose();

        ImageIO.write(bufferedImage1, "PNG", new File("F:" + File.separator + "Z2.PNG"));


    }
}

 

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

智能推荐

一、Java环境搭建和Java运行原理_jre jdk的安装及程序设计原理-程序员宅基地

文章浏览阅读379次。1. Java环境开发搭建1.1 Java编程语言1. 什么是Java编程语言编程语言就是人类和计算机沟通的桥梁编程语言的发展史 机器语言: 机器语言是用二进制就是最开始01代码组成的计算机能够直接识别和执行的一种机器指令的集合 汇编语言 汇编语言是由一些指令或者符号组合而成 高级语言 高级语言是以人类的日常语言为基础的一种编程语言,是用来人类更加易于接受的文字来表示(英文) C++,C#,php,python,Java(Java是全世界最好的语_jre jdk的安装及程序设计原理

Intellij IDEA Java compiler 重置问题_idea中,java compile,use compiler老是重置-程序员宅基地

文章浏览阅读187次。你是不是发现你的JDK 明明用的 17,结果编译使用的是 1.5 或者 1.8。在你的 pom.xml 里添加 maven 编译插件,版本 17。对没错,就是这个 java compiler 在捣鬼。_idea中,java compile,use compiler老是重置

AnyTXT Searcher 一款强大的本地文件内容搜索软件,快速实现在线办公搜索神器!-程序员宅基地

文章浏览阅读4.7k次,点赞6次,收藏8次。你是否遇到过这种情况,异地办公或者不在公司,想找到一篇课件或者想找到某个文件,你只记得资料文件或者课件里的某一句话,却不记得它的名字,你花了大量的时间,大量的精力,却怎么也找不到这个文件在哪个地方,看完本篇文章,希望能解决你的这个问题!Any TXT结合[cpolar](cpolar - 安全的内网穿透工具)内网穿透帮你实现异地办公寻迅速查找到公司电脑的文件!之前曾给大家介绍过搜索工具Everything,搜索速度很快,但是不足的是这个只能根据文件名进行搜索。_anytxt

人大金仓数据库KingbaseES一种JDBC读写分离权重负载均衡的实现方法-程序员宅基地

文章浏览阅读405次,点赞9次,收藏8次。如图2 所示,用户需先设置各个数据源权重的初始值,内部函数对权重初始值进行优化,将无穷大的权重设置为10000,将空值的权重设置为1。最后,使用随机数生成方法,获取0到1之间的随机数(不包含0),判断该随机数所归属的数值区间,该数值区间所对应的数据源节点即是当前请求所需分发的目标节点。KES-JDBC提出一种读写分离权重负载均衡的实现方法,该方法不需要从服务端采集数据,也不需要在代理处统计各服务器的负载率,而是依靠随机数来实现集群的负载均衡。因此,良好的权重负载均衡方法是高性能数据库集群的关键之一。

PKI/CA工作原理及架构_单个ca的pki结构图-程序员宅基地

文章浏览阅读9.2k次,点赞2次,收藏27次。相关概念PKI:Public Key Infrastructure,公钥基础设施。 CA:Certificate Of Authority,认证中心。 数字证书:提供了一种发布公钥的简便途径; 一个数字证书包括:拥有者身份信息、公钥、CA数字签名、有效期等其他信息。 数字签名:用来确认信息发送者的身份,保证信息的完整性和抗否认性。数字签名图1 数字签名数字签名的生成:对于..._单个ca的pki结构图

ASP.NET 使用alert弹出对话框后,CSS样式失效,字体变大的解决方法_vs.net2017web中alert怎么不能用-程序员宅基地

文章浏览阅读632次。弹出提示窗口用的Response.Write("alert('删除成功');"),原来好用,不知道什么原因不能用了解决方法如下:使用Page.ClientScript.RegisterStartupScript(this.GetType(), "", "alert('XXXX');"); 代替原来的书写方式可以写成一个方法,供多处使用public static void WebM_vs.net2017web中alert怎么不能用

随便推点

合成模式(Composite Pattern) _合成模式 csdn 男装-程序员宅基地

文章浏览阅读924次。对象的树结构一个树结构由两种节点组成:树枝节点和树叶节点。树枝节点可以有子节点,而一个树叶节点不可以有子节点。除了根节点外,其它节点有且只有一个父节点。注意:一个树枝节点可以不带任何叶子,但是它因为有带叶子的能力,因此仍然是树枝节点,而不会成为叶节点。一个树叶节点永远不可能带有子节点。二、 合成模式概述下图所示的类图省略了各个角色的细节。 可以看出,上面的类图结构涉及到三个_合成模式 csdn 男装

java职业发展路线图_Java开发工程师职业发展及晋升路线图-程序员宅基地

文章浏览阅读774次。原标题:Java开发工程师职业发展及晋升路线图对于一个Java开发工程师来讲,了解Java开发的职业发展及晋升路线是十分有必要的。不仅可以帮助自己更好地规划对未来的职业发展,而且在求职时有了更加明确的方向。那么Java开发工程师的职业发展及晋升路线图是怎么样的呢?我们一起来看看。 1.Java程序员这是Java开发工程师的第一阶段了,一般是刚入门Java行业者。这一阶段主要是掌握了一定的Java编..._java开发工程师路线图

vue项目input输入框双向绑定数据不实时生效_表单内输入框无法输入双向绑定失效-程序员宅基地

文章浏览阅读1w次。<input type="text" maxlength="11" placeholder="请输入联系人电话" v-model="form.phone" />//这样的输入框,绑定的是data中的form对象上的phone字段。在mounted钩子函数里边写:this.form.phone = '1888888888';//这样在页面上时候不会随着输入框值改变..._表单内输入框无法输入双向绑定失效

mysql 前沿表设计_史上最简单MySQL教程详解(基础篇)之表的维护和改造-程序员宅基地

文章浏览阅读58次。表结构修改在我们实际的开发的过程,随着开发的深入,会发现我们事先设计好的表可能已经不再适合,就会设计到对表的修改和改造。这里我就向大家介绍一下一些常用的方法和情况。这里我们使用的是之前在中就已经使用到了【ALTER】语句进行修改。注意事项:任何设计到表的的修改和改造的操作,都有可能发生不可预知的错误或者情况出现,所以安全起见,请在每次操作之前都做好数据的备份,以防万一。修改列的数据类型具体如下:A..._一个表的维护表设计

Python面向对象编程:类与对象-程序员宅基地

文章浏览阅读236次,点赞3次,收藏8次。1.背景介绍1. 背景介绍面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它将问题抽象为一组相关的对象,这些对象可以与一 another 进行交互。Python是一种强类型动态语言,支持面向对象编程,这使得Python成为了许多大型项目的首选编程语言。在本文中,我们将深入探讨Python的面向对象编程特性,包括类、对象、继承、多态等。2. ...

蚂蚁二面遭JVM调优灵魂拷问,逼得我啃透500页JVM实战笔记,成功上岸京东-程序员宅基地

文章浏览阅读505次,点赞5次,收藏12次。就写到这了,也算是给这段时间的面试做一个总结,查漏补缺,祝自己好运吧,也希望正在求职或者打算跳槽的 程序员看到这个文章能有一点点帮助或收获,我就心满意足了。多思考,多问为什么。希望小伙伴们早点收到满意的offer!越努力越幸运!金九银十已经过了,就目前国内的面试模式来讲,在面试前积极的准备面试,复习整个 Java 知识体系将变得非常重要,可以很负责任的说一句,复习准备的是否充分,将直接影响你入职的成功率。

推荐文章

热门文章

相关标签