Kotlin 实战

基于 Compose Desktop 实现的图像编辑器之各种形状

2024-06-17  本文已影响0人  fengzhizi715

一. 图像编辑器 Monica

Monica 是一款跨平台的桌面图像编辑软件,使用 Kotlin Compose Desktop 进行开发。

它基于 mvvm 架构,由于应用层都是由 Kotlin 编写的,所以使用 koin 作为依赖注入框架。

Monica github 地址:https://github.com/fengzhizi715/Monica

Monica 目前还处于开发阶段,当前版本的主要功能包括:

二. 多种形状的裁剪

在该系列上一篇文章中,曾介绍过 Monica 的裁剪功能。现在 Monica 可以通过设置裁剪属性支持多种形式的裁剪。

1.png

下面,我们以正六边形为裁剪框来裁剪图像。


2.png

在主界面显示截取之后的图像。


3.png

接下来,还可以以爱心为裁剪框来裁剪图像。


4.png 5.png

三. 图像取色

在 Monica 的基础功能里,有一个比较有意思的功能,对图像取色。

6.png

这个功能通过点击图像中的位置,获取颜色相关的信息,包括 HEX 颜色代码值、RGB 值、 HSL 值和 HSV 值。

7.png 8.png

四. 基于查找表实现的色彩滤镜

在计算机科学中,查找表Lookup Table)是用简单的查询操作替换运行时计算的数组或者关联数组这样的数据结构。由于从内存中提取数值经常要比复杂的计算速度快很多,所以这样得到的速度提升是很显著的。

在图像处理中,查找表将索引号与输出值建立联系。查找表是一种常用的图像处理方法,用于对图像进行像素级别的颜色映射或图像增强操作。LUT 查找表可以实现快速、高效的颜色转换和像素操作,尤其在处理大量像素的情况下具有优势。

Monica 参考了 OpenCV 中 applyColorMap() 函数,通过 LUT 在给定的图像上应用色彩映射。

const val AUTUMN_STYLE: Int = 0
const val BONE_STYLE = 1
const val COOL_STYLE = 2
const val HOT_STYLE = 3
const val HSV_STYLE = 4
const val JET_STYLE = 5
const val OCEAN_STYLE = 6
const val PINK_STYLE = 7
const val RAINBOW_STYLE = 8
const val SPRING_STYLE = 9
const val SUMMER_STYLE = 10
const val WINTER_STYLE = 11

fun getColorFilterLUT(style: Int): Array<IntArray> {

    return when (style) {
        AUTUMN_STYLE  -> AutumnLUT.AUTUMN_LUT
        BONE_STYLE    -> BoneLUT.BONE_LUT
        COOL_STYLE    -> CoolLUT.COOL_LUT
        HOT_STYLE     -> HotLUT.HOT_LUT
        HSV_STYLE     -> HsvLUT.HSV_LUT
        JET_STYLE     -> JetLUT.JET_LUT
        OCEAN_STYLE   -> OceanLUT.OCEAN_LUT
        PINK_STYLE    -> PinkLUT.PINK_LUT
        RAINBOW_STYLE -> RainbowLUT.RAINBOW_LUT
        SPRING_STYLE  -> SpringLUT.SPRING_LUT
        SUMMER_STYLE  -> SummerLUT.SUMMER_LUT
        WINTER_STYLE  -> WinterLUT.WINTER_LUT
        else          -> AutumnLUT.AUTUMN_LUT
    }
}

下面的 ColorFilter 滤镜,实现了 12 种风格的色彩映射。

class ColorFilter(val style: Int = 0) : ColorProcessorFilter() {

    private fun getStyleLUT(style: Int): Array<IntArray> = getColorFilterLUT(style)

    override fun doColorProcessor(dstImage: BufferedImage): BufferedImage {
        var tr = 0
        var tg = 0
        var tb = 0
        val lut = getStyleLUT(style)
        val size: Int = R.size
        for (i in 0 until size) {
            tr = R[i].toInt() and 0xff
            tg = G[i].toInt() and 0xff
            tb = B[i].toInt() and 0xff
            R[i] = lut[tr][0].toByte()
            G[i] = lut[tg][1].toByte()
            B[i] = lut[tb][2].toByte()
        }

        return toBufferedImage(dstImage)
    }
}
9png.png 10.png

五. 总结

Monica 目前到了 0.2.3 版本,后期的重点是增加优化部分算法、提高效率,增加用户和软件的交互,尝试引入一些深度学习的算法等等。然后,接下来会考虑提供各个平台的安装包。

Monica github 地址:https://github.com/fengzhizi715/Monica

该系列的相关文章:
图像编辑器 Monica 之图像涂鸦、裁剪、有趣的滤镜
使用 Kotlin Compose Desktop 开发的图像编辑器

上一篇 下一篇

猜你喜欢

热点阅读