JavaFx 生成二维码工具类封装
原文地址: JavaFx 生成二维码工具类封装 - Stars-One的杂货小窝
之前星之音乐下载器有需要生成二维码功能,当时用的是一个开源库来实现的,但是没过多久,发现那个库依赖太多,有个http-client的依赖,把软件都搞大了一倍,而且有时候开发的时候下载依赖还报错,就想换个方案
于是在网上找了下解决方案,最终只需要依赖两个zxing的两个依赖即可实现功能
本文基于TornadoFx框架进行编写,封装工具代码是kotlin版本,工具类已经封装在common-controls库中
工具支持带logo图标,带底部文本的二维码生成
代码封装
1.引入依赖
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.5.0</version>
</dependency>
2.使用
由于工具代码过多不便阅读,就先讲些使用,工具代码就放下面了
比较核心的就两个方法,如下面代码所示,其他的方法是带Swing关键字,就是生成Swing包中的Image对象
getQRcodeFxImg()方法就是直接生成Fx的Image对象,可以JavaFx中直接使用
/**
* 初始化设置
*
* @param qrcodeSize 二维码尺寸,默认为320(即320*320)
* @param logoSize logo图标尺寸,默认为80(即80*80)
* @param bottomTextSize 底部文字大小,默认20px
* @param qrcodeType 二维码图片格式,默认为png
*/
fun initConfig(qrcodeSize: Int = 320, logoSize: Int = 80, bottomTextSize: Int = 20, qrcodeType: String = "PNG")
/**
* 生成二维码图片
*
* @param data 二维码文本内容
* @param logoPath 图标图片的路径
* @param bottomText 底部文字
* @return fx的img对象
*/
fun getQRcodeFxImg(data: String?, logoPath: String?=null, bottomText: String?=null): WritableImage
使用的话也比较简单:
//得到的swing的image对象
val buImg = QRCodeUtil.getQRcodeFxImg("这是测试文本")
val buImg1 = QRCodeUtil.getQRcodeFxImg("这是测试文本", null, "底部文字")
val buImg2 = QRCodeUtil.getQRcodeFxImg("这是测试文本", "/x5.jpg", "底部文字")
val list = listOf(buImg, buImg1, buImg2)
hbox(20.0) {
list.forEach {
imageview(it) {
fitWidth = 200.0
fitHeight = 200.0
}
}
}
3.工具库代码
/**
* 二维码生成工具类
* Created by stars-one
*/
object QRCodeUtil {
private var QRCODE_SIZE = 320 // 二维码尺寸,宽度和高度均是320
private var LOGO_SIZE = 80 // 二维码里logo的尺寸,宽高一致 80*80
private var BOTTOM_TEXT_SIZE = 20 // 底部文本的文字大小
private var FORMAT_TYPE = "PNG" // 二维码图片类型
/**
* 初始化设置
*
* @param qrcodeSize 二维码尺寸,默认为320(即320*320)
* @param logoSize logo图标尺寸,默认为80(即80*80)
* @param bottomTextSize 底部文字大小,默认20px
* @param qrcodeType 二维码图片格式,默认为png
*/
fun initConfig(qrcodeSize: Int = 320, logoSize: Int = 80, bottomTextSize: Int = 20, qrcodeType: String = "PNG") {
QRCODE_SIZE = qrcodeSize
LOGO_SIZE = logoSize
BOTTOM_TEXT_SIZE = bottomTextSize
FORMAT_TYPE = qrcodeType
}
/**
* 生成二维码图片
*
* @param data 二维码文本内容
* @param logoPath 图标图片的路径
* @param bottomText 底部文字
* @return
*/
fun getQRcodeFxImg(data: String?, logoPath: String?=null, bottomText: String?=null): WritableImage {
val resources = ResourceLookup(this)
val url = if (logoPath == null) {
null
} else {
resources.url(logoPath)
}
val swingImg = getQRCodeSwingImg(data, url, bottomText)
return SwingFXUtils.toFXImage(swingImg,null)
}
/**
* 默认需要logo,无底部文字
* 返回 BufferedImage 可以使用ImageIO.write(BufferedImage, "png", outputStream);输出
*
* @param dataStr
* @return 返回 BufferedImage 可以使用ImageIO.write(BufferedImage, "png", outputStream);输出
*/
@Throws(Exception::class)
fun getQRCodeSwingImg(dataStr: String?): BufferedImage {
return getQRCodeSwingImg(dataStr, null, null)
}
/**
* 默认需要logo,无底部文字
*
* @param dataStr
* @return 返回字节数组
*/
@Throws(Exception::class)
fun getQRCodeByte(dataStr: String?): ByteArray {
val bufferedImage = getQRCodeSwingImg(dataStr, null, null)
val outputStream = ByteArrayOutputStream()
ImageIO.write(bufferedImage, FORMAT_TYPE, outputStream)
return outputStream.toByteArray()
}
/**
* 默认需要logo,包含底部文字 文字为空则不显示文字
* 返回 BufferedImage 可以使用ImageIO.write(BufferedImage, "png", outputStream);输出
*
* @param dataStr
* @return
*/
@Throws(Exception::class)
fun getQRCodeSwingImg(dataStr: String?, bottomText: String?): BufferedImage {
return getQRCodeSwingImg(dataStr, null, bottomText)
}
/**
* 默认需要logo,包含底部文字 文字为空则不显示文字
*
* @param dataStr
* @return 返回字节数组
*/
@Throws(Exception::class)
fun getQRCodeByte(dataStr: String?, bottomText: String?): ByteArray {
val bufferedImage = getQRCodeSwingImg(dataStr, null, bottomText)
val outputStream = ByteArrayOutputStream()
ImageIO.write(bufferedImage, FORMAT_TYPE, outputStream)
return outputStream.toByteArray()
}
/**
* 获取二维码图片
*
* @param dataStr 二维码内容
* @param needLogo 是否需要添加logo
* @param bottomText 底部文字 为空则不显示
* @return
*/
@Throws(Exception::class)
fun getQRCodeSwingImg(dataStr: String?, url: URL?, bottomText: String?): BufferedImage {
if (dataStr == null) {
throw RuntimeException("未包含任何信息")
}
val hints = HashMap<EncodeHintType, Any?>()
hints[EncodeHintType.CHARACTER_SET] = "utf-8" //定义内容字符集的编码
hints[EncodeHintType.ERROR_CORRECTION] = ErrorCorrectionLevel.L //定义纠错等级
hints[EncodeHintType.MARGIN] = 1
val qrCodeWriter = QRCodeWriter()
val bitMatrix = qrCodeWriter.encode(dataStr, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints)
val width = bitMatrix.width
val height = bitMatrix.height
var tempHeight = height
if (StringUtils.isNotBlank(bottomText)) {
tempHeight = tempHeight + 12
}
val image = BufferedImage(width, tempHeight, BufferedImage.TYPE_INT_RGB)
for (x in 0 until width) {
for (y in 0 until height) {
image.setRGB(x, y, if (bitMatrix[x, y]) -0x1000000 else -0x1)
}
}
// 判断是否添加logo
if (url != null) {
insertLogoImage(image, url)
}
// 判断是否添加底部文字
if (StringUtils.isNotBlank(bottomText)) {
addFontImage(image, bottomText)
}
return image
}
/**
* 插入logo图片
*
* @param source 二维码图片
* @throws Exception
*/
@Throws(Exception::class)
private fun insertLogoImage(source: BufferedImage, url: URL) {
var src: Image = ImageIO.read(url)
val width = LOGO_SIZE
val height = LOGO_SIZE
val image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH)
val tag = BufferedImage(width, height, BufferedImage.TYPE_INT_RGB)
val g = tag.graphics
g.drawImage(image, 0, 0, null) // 绘制缩小后的图
g.dispose()
src = image
// 插入LOGO
val graph = source.createGraphics()
val x = (QRCODE_SIZE - width) / 2
val y = (QRCODE_SIZE - height) / 2
graph.drawImage(src, x, y, width, height, null)
val shape: Shape = RoundRectangle2D.Float(x.toFloat(), y.toFloat(), width.toFloat(), width.toFloat(), 6f, 6f)
graph.stroke = BasicStroke(3f)
graph.draw(shape)
graph.dispose()
}
private fun addFontImage(source: BufferedImage, declareText: String?) {
//生成image
val defineWidth = QRCODE_SIZE
val defineHeight = 20
val textImage = BufferedImage(defineWidth, defineHeight, BufferedImage.TYPE_INT_RGB)
val g2 = textImage.graphics as Graphics2D
//开启文字抗锯齿
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON)
g2.background = Color.WHITE
g2.clearRect(0, 0, defineWidth, defineHeight)
g2.paint = Color.BLACK
val context = g2.fontRenderContext
//部署linux需要注意 linux无此字体会显示方块
val font = Font("宋体", Font.BOLD, BOTTOM_TEXT_SIZE)
g2.font = font
val lineMetrics = font.getLineMetrics(declareText, context)
val fontMetrics: FontMetrics = FontDesignMetrics.getMetrics(font)
val offset = ((defineWidth - fontMetrics.stringWidth(declareText)) / 2).toFloat()
val y = (defineHeight + lineMetrics.ascent - lineMetrics.descent - lineMetrics.leading) / 2
g2.drawString(declareText, offset.toInt(), y.toInt())
val graph = source.createGraphics()
//开启文字抗锯齿
graph.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON)
//添加image
val width = textImage.getWidth(null)
val height = textImage.getHeight(null)
val src: Image = textImage
graph.drawImage(src, 0, QRCODE_SIZE - 8, width, height, Color.WHITE, null)
graph.dispose()
}
}
JavaFx 生成二维码工具类封装的更多相关文章
- iOS开发——生成二维码——工具类
啥也不说,直接上源码,拷过去就能用.生成二维码的工具类使用方法在ProduceQRCode.h里有示例说明 分别将下面的ProduceQRCode.h和ProduceQRCode.m对应的代码考到自己 ...
- java生成二维码工具类
package com.runtime.extend.utils.CodeCreate; import com.google.zxing.*;import com.google.zxing.commo ...
- Java使用Zxing生成、解析二维码工具类
Zxing是Google提供的关于条码(一维码.二维码)的解析工具,提供了二维码的生成与解析的方法. 1.二维码的生成 (1).将Zxing-core.jar 包加入到classpath下. (2). ...
- 二维码工具类 - QrcodeUtils.java
二维码工具类,提供多种生成二维码.解析二维码的方法,包括中间logo的二维码等方法. 源码如下:(点击下载 - QrcodeUtils.java.MatrixToImageWriterEx.java. ...
- java二维码工具类,中间带LOGO的,很强大
jar包下载maven 配置: Xml代码 收藏代码 <dependency> <groupId>com.google.zxing</groupId> <ar ...
- java 生成微信的二维码 工具类
package com.app.wii.util; import java.io.File;import java.io.FileInputStream;import java.io.FileOutp ...
- java 生成二维码工具
二维码生成 Gitee:https://gitee.com/search?utf8=%E2%9C%93&search=qrext4j&group_id=&project_id= ...
- iOS开发——扫描二维码——工具类
(代码已测试好,空闲时间更新……)
- 利用Spring Boot+zxing,生成二维码还能这么简单
在网站开发中,经常会遇到要生成二维码的情况,比如要使用微信支付.网页登录等,本文分享一个Spring Boot生成二维码的例子,这里用到了google的zxing工具类. 本文目录 一.二维码简介二. ...
- 使用google zxing生成二维码图片
生成二维码工具类: 1 import java.awt.geom.AffineTransform; 2 import java.awt.image.AffineTransformOp; 3 impor ...
随机推荐
- 基于C语言的小学四则运算出题器
一.实验目的: 1.帮助老师产出每周随机的300道含有两个运算符的四则运算,. 2.每次题目的产出均为随机,增强同学的四则运算能力. 二.实验环境: Visual C++ 三.实验内容: 1.实现随机 ...
- 思考20230208-关于chatGPT
最近的ChatGPT火了,我今天FQ.充了1 USD买了个虚拟手机号创建了openAI 的账号,试了一把,它的表现令我叹为观止.他已经不再是简单的基于海量数据在网络上搜索已有的答案,而是会根据用户的想 ...
- appium自动化时,automatic server里面desired capabilities的json representation设置
一点一点来,记号下: 大体格式如下: { "platformName": "Android", "platformVersion": &qu ...
- 给jui(dwz)的菜单树换一套漂亮的图标
JUI是一个免费开源的框架,在使用初期,会遇到一些麻烦,因为文档实在太少了,完全不知道从哪里入门,但是,一旦你深入学习后,你会发现,你的选择是不错的,它会提高你开发的效率,同时,你会深深爱上它. 目前 ...
- archlinux基本安装、以及图形化界面
磁盘刻录 在windows下载磁盘刻录工具 rufus,官网:https://rufus.ie/zh/ 中文界面,实在不是可以搜索一下磁盘刻录教程 在linux下使用balena-etcher,官网: ...
- Spring Boot笔记--Spring Boot相关介绍+快速入门
相关介绍 简化了Spring开发,避免了Spring开发的繁琐过程 提供了自动配置.起步依赖.辅助功能 快速入门 结果呈现: 相关过程: helloController.java package or ...
- 把 ChatGPT 加入 Flutter 开发,会有怎样的体验?
前言 ChatGPT 最近一直都处于技术圈的讨论焦点.它除了可作为普通用户的日常 AI 助手,还可以帮助开发者加速开发进度.声网社区的一位开发者"小猿"就基于 ChatGPT 做了 ...
- Vue-Router 路由与配置
现在的很多应用都流行SPA应用(singe page application) . 传统的项目大多使用多页面结构,需要切换内容的时候我们往往会进行单个html文件的跳转,这个时候因受到网络.性能的影 ...
- 传参base64时的+号变空格问题
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明. 问题发生 上上周,看到一位老哥找我们组同事联调接口,不知道是什么问题,两人坐一起搞了快1个小时,看起来好像有点复 ...
- 万字血书React—走近React
配置开发环境 脚手架工具create-react-app 储备知识:终端或命令行.代码编辑器 React官方中文文档 create-react-app 其是基于Node的快速搭建React项目的脚手架 ...