专栏首页javafx框架tornadofx二维码生成小工具,采用javafx框架tornadofx实现界面开发
原创

二维码生成小工具,采用javafx框架tornadofx实现界面开发

import javafx.application.Application
import javafx.beans.property.SimpleObjectProperty
import javafx.embed.swing.SwingFXUtils
import javafx.scene.image.Image
import javafx.scene.image.WritableImage
import tornadofx.*
import javax.imageio.ImageIO
import com.google.zxing.BarcodeFormat
import com.google.zxing.EncodeHintType
import com.google.zxing.MultiFormatWriter
import com.google.zxing.client.j2se.MatrixToImageWriter
import javafx.geometry.Pos
import javafx.scene.paint.Color
import javafx.scene.text.FontWeight
import javafx.stage.FileChooser
import javafx.stage.Stage
import java.awt.image.BufferedImage
import java.io.File
import java.util.*

fun main() = Application.launch(QrCodeGenApp::class.java)
class QrCodeGenApp : App(QrCodeGen::class,Styles::class)

val imgPath = stringProperty()
val info = stringProperty()
val qrImage = SimpleObjectProperty<Image>()
val hasImage = booleanProperty(false)
val srcImg = SimpleObjectProperty<Image>()

class QrCodeGen : View("二维码生成器") {
    override val root = borderpane {
        prefWidth = 700.0
        prefHeight = 500.0
        top = vbox(10) {
            hbox(10) {
                button("选择图片").action { chooseImg() }
                textfield(imgPath)
                alignment = Pos.CENTER
            }
            hbox(10) {
                button("生成二维码图像") {
                    enableWhen(imgPath.isNotEmpty)
                    action { genQRCode() }
                }
                button("保存二维码图像至本地") {
                    enableWhen(hasImage)
                    action { saveImg() }
                }
                alignment = Pos.CENTER
            }
        }
        center = hbox(10) {
            alignment = Pos.CENTER
            vbox(5) {
                label("原始图片")
                imageview(srcImg) {
                    fitHeight = 300.0
                    fitWidth = 300.0
                    isPickOnBounds = true
                    isPreserveRatio = true
                    alignment = Pos.CENTER
                }
            }
            vbox(5) {
                label("二维码图像")
                imageview(qrImage) {
                    fitHeight = 300.0
                    fitWidth = 300.0
                    isPickOnBounds = true
                    isPreserveRatio = true
                    alignment = Pos.CENTER
                }
            }
        }
        bottom = hbox {
            label(info)
        }
    }

    private fun chooseImg() {
        val imgType = listOf("*.jpg", "*.png", "*.bmp", "*.gif")
        imgPath.value = chooseFile0("选择图片", imgType)
    }

    private fun chooseFile0(title: String? = null, filetype: List<String>): String {
        val efset = arrayOf(FileChooser.ExtensionFilter("$filetype", filetype))
        val imgFile = chooseFile(title, efset, FileChooserMode.Single) {
            // 初始目录为当前项目目录
            initialDirectory = File(File("").canonicalPath)
        }
        if (imgFile.isNotEmpty()) {
            var imgpath1 = imgFile.first().toString().replace("\\", "/")
            // linux系统下文件绝对路径以“/”开头,windows系统下文件绝对路径包含":"
            if (imgpath1.startsWith("/").or(imgpath1.contains(":"))) {
                imgpath1 = "file:$imgpath1"
                srcImg.value = Image(imgpath1)
                info.value = "选择图片文件: $imgpath1"
            }
            return imgpath1
        } else {
            hasImage.value = false
            return ""
        }
    }

    private fun saveImg() {
        if (!hasImage.value) return
        val fileChooser = FileChooser()
        fileChooser.title = "保存图片"
        fileChooser.initialDirectory = File(File("").canonicalPath)
        fileChooser.initialFileName = "qrcode.png"
        val file = fileChooser.showSaveDialog(Stage()) ?: return

        ImageIO.write(SwingFXUtils.fromFXImage(qrImage.value, null), "png", file)
//        information(header = "", content = "保存图片到${file.absolutePath}成功", title = "保存图片")
        info.value = "保存图片到  ${file.absolutePath}  成功"
    }

    private fun genQRCode() {
        if (imgPath.value.isEmpty()) return
        val bufImage = createQR(imgPath.value)
        val writeAbleImage = WritableImage(bufImage!!.width, bufImage.height)
        qrImage.value = SwingFXUtils.toFXImage(bufImage, writeAbleImage)
        hasImage.value = true
    }

    private fun createQR(imgpath: String): BufferedImage? {
        val hints = Hashtable<EncodeHintType, String>()
        hints[EncodeHintType.CHARACTER_SET] = "utf-8"
        val bitMatrix = MultiFormatWriter().encode(imgpath, BarcodeFormat.QR_CODE, 300, 300, hints)
        return MatrixToImageWriter.toBufferedImage(bitMatrix);
    }
}

class Styles : Stylesheet() {
    init {
        button {
            padding = box(10.px)
            alignment = Pos.CENTER
            backgroundColor += c("#DD7549")
            fontWeight = FontWeight.EXTRA_BOLD
            fontSize=18.px

            and (hover) {
                backgroundColor += c("#A05434")
                textFill = Color.WHITE
            }
        }
        label{
            fontSize=18.px
            textFill = Color.RED
        }
    }
}

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • javafx框架tornadofx画个心形

    用户6167008
  • 做了个简易浏览器

    用户6167008
  • 吃鱼小游戏,可以让小朋友练习键盘方向键和鼠标,采用javafx框架tornadofx实现

    用户6167008
  • javafx框架tornadofx画个心形

    用户6167008
  • 做了个简易浏览器

    用户6167008
  • 吃鱼小游戏,可以让小朋友练习键盘方向键和鼠标,采用javafx框架tornadofx实现

    用户6167008
  • spark ML算法之线性回归使用

    转载请务必注明原创地址为:http://dongkelun.com/2018/04/09/sparkMlLinearRegressionUsing/

    董可伦
  • 微信小程序之订阅消息推送java开发

    具体公告地址:https://developers.weixin.qq.com/community/develop/doc/00008a8a7d8310b6bf...

    猿码优创
  • 微信小程序之订阅消息推送java开发

    具体公告地址:https://developers.weixin.qq.com/community/develop/doc/00008a8a7d8310b6bf...

    猿码优创
  • Jcseg分词器的实现详解

    1.之前的项目一直都是用的ik分词器,但是最近的一个项目项目大佬说ik好像很长时间都没更新,版本太老旧,故而用了新的jcseg的分词器,于是也上网找了一些资料,...

    用户1171305

扫码关注云+社区

领取腾讯云代金券