前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >二维码生成小工具,采用javafx框架tornadofx实现界面开发

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

原创
作者头像
用户6167008
修改2019-09-11 18:59:30
1.4K0
修改2019-09-11 18:59:30
举报
文章被收录于专栏:javafx框架tornadofx
代码语言:txt
复制
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
        }
    }
}

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档