2016-03-14 24 views
2

我們想要使用CoreImageiOS 8.0+應用程序中實現HSL顏色調整濾鏡。使用CoreImage的iOS 8.0+應用程序中的HSL顏色調整濾鏡

加載圖像之後,用戶選擇的顏色(如紅色),然後是能夠調整色調飽和,並且只有圖像內的色的亮度。此過濾器可能會在顯示預覽的同時多次應用,因此性能非常重要。

濾波器應接受inputImage的的參數,目標顏色,然後色調飽和的調整,和亮度

UI example

CIImage *inputImage 
UIColor *targetColor 
float hueAdjustment (identity 0) 
float saturationAdjustment (identity 0) 
float luminanceAdjustment (identity 0) 

我們已經嘗試過這種方法,而且由於這適用HSB過濾器,以整體形象,而不是特定的顏色,我們不能用這個 How to apply HSB color filters to UIImage

我有一種感覺,這涉及CIColorMatrix ,但我不確定我們如何才能使矩陣適用於特定的顏色範圍。

+2

雖然聽起來很蠢,但你對「一種顏色」的定義是什麼?如果我選擇紅色 - (1.0,0.0,0.0) - 並將其映射到藍色,那麼我的源圖像中像素會發生什麼變化,例如(0.99,0.0,0.0)?不會因爲數字上的不同而產生不同的顏色,因爲它足夠接近,通過與紅色接近的比例相關的數量來調整,就好像是純紅色一樣,還是其他的東西? – Tommy

+0

它根本不是白癡。正如你所說的那樣,它應該按照一定比例的量進行顏色調整。比例本身可以設置爲「容差」或其他一些變量,可能每種顏色的容差都會被調整,或者通過其他類似的方法 – Efesus

回答

3

編輯:完整的過濾器(斯威夫特)是available here

好的,那麼另一種方法呢。你可以單獨治療適用於每個頻段採用了酷睿圖像色彩核心,其中將包括沿行代碼:

kernel vec4 rgbChannelCompositing(__sample pixel, vec3 hsl0, vec3 hsl1, [...]) 
{ 
    float hue = rgb2hsv(pixel).x; // there are lots of rgb2hsv() on the internet :) 

    if (hue < color1) 
    { 
     return treatment(pixel, hsl0); 
    } 
    else if (hue >= color1 && hue < color2) 
    { 
     return treatment(pixel, hsl1); 
    } 
    [...] 

treatment()功能會基於傳遞到內核的色調,飽和度和亮度值的魔法功能。這可以像調整HSV值一樣簡單,通過互聯網上的衆多hsv2rgb()實現之一將它們轉換回RGB並返回。

您可能會得到一些條帶,在這種情況下smoothstep()將有所幫助。我做了類似的事情來創建一個僞彩色濾鏡。就我而言,我是基於光度而不是顏色來定義波段,但基本方法是相同的(我認爲!)。

請看我的CustomFilters.swift文件中的PseudoColor

4

如果您願意只對紅色,綠色和藍色進行控制,則有一個簡單的解決方案。我寫了接受三幅圖像,並將它們組合成一個由各個頻道的小CIColorKernel

kernel vec4 rgbChannelCompositing(__sample red, __sample green, __sample blue) 
{ 
    return vec4(red.r, green.g, blue.b, 1.0); 
} 

這意味着你可以使用3支CI過濾鏈控制色相(CIHueAdjust),飽和度和亮度(CIColorControls)到你的單圖像並將它們與我的內核結合起來。

恰巧,我已經做了類似的規定 - 你可以看到我的雨燕代碼在這裏:https://github.com/FlexMonkey/Filterpedia/blob/master/Filterpedia/customFilters/RGBChannelCompositing.swift

希望幫助!

西蒙

+0

謝謝!這可能會有所幫助,但我們正在使用8種特定顏色(如0.27,0.90,0.27)而不是RGB,所以您是否有任何想法如何調整以適應任意顏色? – Efesus