JavaFx 生成二维码工具类封装

这篇具有很好参考价值的文章主要介绍了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

使用的话也比较简单:文章来源地址https://www.toymoban.com/news/detail-428048.html

//得到的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 生成二维码工具类封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 二维码生成&点击按钮展示二维码

    使用HBuider 1.先安装插件 (地址 :  https://ext.dcloud.net.cn/plugin?id=1287) 这里直接就安装到了uni-modules里面了 import uQRCode from ‘@/uni_modules/Sansnn-uQRCode/components/u-qrcode/u-qrcode.vue’ 弹框用到了uni-app提供的uni-popup弹框,把二维码放到内容那块,替换即可

    2024年02月10日
    浏览(53)
  • js生成二维码和解析二维码

    这个整了好久,用的包换了好几次,所以记录一下 生成二维码 解析二维码 然后是两个引入的js reqrcode和qrcode

    2023年04月09日
    浏览(52)
  • Android studio 实现生成二维码和扫描二维码

    效果图 build.gradle(:app)添加依赖 Manifests.xml activity_main.xml MainActivity ScanActivity

    2024年02月10日
    浏览(47)
  • 生成微信小程序发布上线后的二维码 、获取微信小程序二维码、微信小程序二维码如何生成?

    情景: 1、在微信小程序审核完成,发布到线上后,想通过扫描小程序二维码进入小程序 2、可分享二维码出去,通过二维码扫码进入小程序 方法: 1、进入微信小程序的后台配置。链接:微信公众平台。(如图一) 2、进入 “设置” -- “ 基本设置” -- “小程序码及线下物

    2024年02月12日
    浏览(57)
  • 【支付系统】java springboot 生成二维码,二维码中文乱码

            支付系统必不可少的就是生成二维码,有时我们会需要将支付链接转换为二维码.用户通过移动设备扫描二维码调起支付. 该篇文章主要使用的是hutool自带的二维码生成功能.  1. 引入依赖(hutool 可以按需引入这里就直接使用all了) 2. hutool的官方已经有很详细的生成方式

    2024年02月11日
    浏览(43)
  • Android实现生成二维码以及扫描二维码的功能(超级简单!)

    文章目录 ​​​​​​ 前言 二、实现生成二维码的功能 三、实现扫面二维码的功能 总结 提示:这里可以添加本文要记录的大概内容: 我是通过一个第三方库来实现二维码的生成,以及扫描二维码的功能,开源库如下: 一、布局文件如下 布局比较简单,就只有简单的一些

    2024年02月12日
    浏览(57)
  • 如何生成微信小程序二维码,小程序内页二维码

    你自己得有个微信公众号,只需要知道小程序的名字就可以了 生成小程序二维码 第一步编辑素材 第二步搜索小程序名字,然后回车,下一步 第三步选小程序码 小程序内页二维码 第一步编辑素材 第二步搜索小程序名字,然后回车,下一步 第三步点击‘获取更多路径’ 第四

    2024年02月15日
    浏览(51)
  • AI生成二维码Stable diffusion生成可识别二维码【附完整教程】&【附完整案例】

    最近的炫酷QR比较火,所以今天给大家分享一下如何实现。首先我们知道QR二维码已经改变了信息的共享和获取方式。但是,QR码的视觉外观可能并不总是符合设计或艺术品的美学要求。为了解决这个问题,ControlNet for Stable Diffusion的工具在Stable Diffusion上可以将QR二维码信息隐藏

    2024年02月16日
    浏览(51)
  • 【Android】实现生成二维码、条形码和扫描二维码的功能

    目录 一、添加依赖 二、布局文件 三、实现生成二维码的功能 四、效果图 要先添加一个第三方库来实现二维码的生成以及扫描二维码的功能,开源库如下: 在build.grade(Moudle)中添加依赖: 效果如下: activity_main.xml: MainActivity.java: 简单粗暴! 感谢ლ(°◕‵ƹ′◕ლ)!!!

    2024年02月11日
    浏览(66)
  • Vue中qrcode的使用方法(生成二维码插件) / 前端页面根据URL链接生成二维码

    1.下载 npm install qrcode --save-dev 2.引入(在所需要的页面中引入) import QRCode from “qrcode”; //引入生成二维码插件 3.生成二维码 作者:微微一笑绝绝子 出处:Vue中qrcode的使用方法(生成二维码插件) / 前端页面根据URL链接生成二维码 - 微微一笑绝绝子 - 博客园 本博客文章均为作者

    2024年02月15日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包