基于 Compose Desktop 實(shí)現(xiàn)的圖像編輯器之各種形狀的裁剪惠豺、圖像取色、使用查找表實(shí)現(xiàn)的濾鏡

一. 圖像編輯器 Monica

Monica 是一款跨平臺的桌面圖像編輯軟件风宁,使用 Kotlin Compose Desktop 進(jìn)行開發(fā)洁墙。

它基于 mvvm 架構(gòu),由于應(yīng)用層都是由 Kotlin 編寫的戒财,所以使用 koin 作為依賴注入框架热监。

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

Monica 目前還處于開發(fā)階段,當(dāng)前版本的主要功能包括:

  • 支持加載本地圖片饮寞、網(wǎng)絡(luò)圖片孝扛。
  • 支持對圖片進(jìn)行局部模糊、打馬賽克幽崩。
  • 支持對圖片進(jìn)行涂鴉苦始,并保存涂鴉的結(jié)果。
  • 支持圖片取色功能
  • 支持圖像的翻轉(zhuǎn)慌申、旋轉(zhuǎn)陌选、縮放
  • 支持各種形狀的裁剪,并保存裁剪的結(jié)果。
  • 調(diào)整圖片的飽和度柠贤、色相香浩、亮度。
  • 提供 20 多款濾鏡臼勉,大多數(shù)濾鏡可以單獨(dú)調(diào)整參數(shù)邻吭。
  • 保存修改的圖像。

二. 多種形狀的裁剪

在該系列上一篇文章中宴霸,曾介紹過 Monica 的裁剪功能〈亚纾現(xiàn)在 Monica 可以通過設(shè)置裁剪屬性支持多種形式的裁剪。

1.png

下面瓢谢,我們以正六邊形為裁剪框來裁剪圖像畸写。


2.png

在主界面顯示截取之后的圖像。


3.png

接下來氓扛,還可以以愛心為裁剪框來裁剪圖像枯芬。


4.png
5.png

三. 圖像取色

在 Monica 的基礎(chǔ)功能里,有一個(gè)比較有意思的功能采郎,對圖像取色千所。

6.png

這個(gè)功能通過點(diǎn)擊圖像中的位置,獲取顏色相關(guān)的信息蒜埋,包括 HEX 顏色代碼值淫痰、RGB 值、 HSL 值和 HSV 值整份。

7.png
8.png

四. 基于查找表實(shí)現(xiàn)的色彩濾鏡

在計(jì)算機(jī)科學(xué)中待错,查找表Lookup Table)是用簡單的查詢操作替換運(yùn)行時(shí)計(jì)算的數(shù)組或者關(guān)聯(lián)數(shù)組這樣的數(shù)據(jù)結(jié)構(gòu)。由于從內(nèi)存中提取數(shù)值經(jīng)常要比復(fù)雜的計(jì)算速度快很多烈评,所以這樣得到的速度提升是很顯著的火俄。

在圖像處理中,查找表將索引號與輸出值建立聯(lián)系础倍。查找表是一種常用的圖像處理方法烛占,用于對圖像進(jìn)行像素級別的顏色映射或圖像增強(qiáng)操作。LUT 查找表可以實(shí)現(xiàn)快速沟启、高效的顏色轉(zhuǎn)換和像素操作,尤其在處理大量像素的情況下具有優(yōu)勢犹菇。

Monica 參考了 OpenCV 中 applyColorMap() 函數(shù)德迹,通過 LUT 在給定的圖像上應(yīng)用色彩映射。

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 濾鏡揭芍,實(shí)現(xiàn)了 12 種風(fēng)格的色彩映射胳搞。

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

五. 總結(jié)

Monica 目前到了 0.2.3 版本,后期的重點(diǎn)是增加優(yōu)化部分算法、提高效率肌毅,增加用戶和軟件的交互筷转,嘗試引入一些深度學(xué)習(xí)的算法等等。然后悬而,接下來會考慮提供各個(gè)平臺的安裝包呜舒。

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

該系列的相關(guān)文章:
圖像編輯器 Monica 之圖像涂鴉、裁剪笨奠、有趣的濾鏡
使用 Kotlin Compose Desktop 開發(fā)的圖像編輯器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末袭蝗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子般婆,更是在濱河造成了極大的恐慌到腥,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔚袍,死亡現(xiàn)場離奇詭異乡范,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)啤咽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門篓足,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闰蚕,你說我怎么就攤上這事栈拖。” “怎么了没陡?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵涩哟,是天一觀的道長。 經(jīng)常有香客問我盼玄,道長贴彼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任埃儿,我火速辦了婚禮器仗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘童番。我一直安慰自己精钮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布剃斧。 她就那樣靜靜地躺著轨香,像睡著了一般。 火紅的嫁衣襯著肌膚如雪幼东。 梳的紋絲不亂的頭發(fā)上臂容,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天科雳,我揣著相機(jī)與錄音,去河邊找鬼脓杉。 笑死糟秘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的球散。 我是一名探鬼主播尿赚,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沛婴!你這毒婦竟也來了吼畏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嘁灯,失蹤者是張志新(化名)和其女友劉穎泻蚊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丑婿,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡性雄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了羹奉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秒旋。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖诀拭,靈堂內(nèi)的尸體忽然破棺而出迁筛,到底是詐尸還是另有隱情,我是刑警寧澤耕挨,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布细卧,位于F島的核電站,受9級特大地震影響筒占,放射性物質(zhì)發(fā)生泄漏贪庙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一翰苫、第九天 我趴在偏房一處隱蔽的房頂上張望止邮。 院中可真熱鬧,春花似錦奏窑、人聲如沸导披。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盛卡。三九已至,卻和暖如春筑凫,著一層夾襖步出監(jiān)牢的瞬間滑沧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工巍实, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滓技,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓棚潦,卻偏偏與公主長得像令漂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子丸边,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容