基于 Compose Desktop 实现的图像编辑器之各种形状的裁剪、图像取色、使用查找表实现的滤镜...

一. 图像编辑器 Monica

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

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

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

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

  • 支持加载本地图片、网络图片。

  • 支持对图片进行局部模糊、打马赛克。

  • 支持对图片进行涂鸦,并保存涂鸦的结果。

  • 支持图片取色功能

  • 支持图像的翻转、旋转、缩放

  • 支持各种形状的裁剪,并保存裁剪的结果。

  • 调整图片的饱和度、色相、亮度。

  • 提供 20 多款滤镜,大多数滤镜可以单独调整参数。

  • 保存修改的图像。

二. 多种形状的裁剪

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

48dca59b873e6132b0f23a8bad980fea.jpeg
1.png

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

在主界面显示截取之后的图像。30fc38873dd81821a0acd8bc53a7def2.jpeg

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

3dc7ac57c9e8e851beaa4ed8582293f8.jpeg
5.png

三. 图像取色

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

0cb6b44d9c9f75321d08d355772c2621.jpeg
6.png

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

46dbd1d2a2e62fc29f39d8cbd0a3518c.jpeg
7.png
3f37faeb78bdffd39bb92722c45600b9.jpeg
8.png

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

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

在图像处理中,查找表将索引号与输出值建立联系。查找表是一种常用的图像处理方法,用于对图像进行像素级别的颜色映射或图像增强操作。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)
    }
}
3475dfea757d34def3c200b463219224.jpeg
9png.png
2264458a5223cd87b22eb49a99d9afe2.jpeg
10.png

五. 总结

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

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

该系列的相关文章:

图像编辑器 Monica 之图像涂鸦、裁剪、有趣的滤镜

使用 Kotlin Compose Desktop 开发的图像编辑器

Java与Android技术栈】公众号

关注 Java/Kotlin 服务端、桌面端 、Android 、机器学习、端侧智能

更多精彩内容请关注:

  • 15
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值