2010年1月25日 星期一

幫圖片加上影像特效 (III) - 負片與灰階效果

Create simple effects for your images (III) - Negative & Grayscale Effects

前兩次提過,簡單地利用 Matrix ,就可以輕易做出 陰影特效鏡像特效

這次,我將向大家分享,如何利用另一種 Matrix - ColorMatrix,來做出負片與灰階效果。

最上面那張圖的上半部,是原來的影像,一個美麗的地球。下半部的左邊,就是這地球影像的負片效果。右邊,則是灰階效果的呈現。

負片效果

負片效果的演算法,很簡單。就像底下這樣。

算法很簡單,可是在 Android 中要如何做到呢?難不成要用 Bitmap.getPixel()Bitmap.setPixel(),逐一針對每個像素來改他的顏色值?!

當然不是!這樣的做法,太沒效率,速度一定很慢。在 Android 中,針對這樣的需求,你可以透過 ColorMatrixColorFilter 來完成。在建構一個 ColorMatrixColorFilter 時,你得傳給他一個 ColorMatrix。因此,重點就在這個 ColorMatrix。

ColorMatrix 文件一開頭的註釋,就已經將他的功能講得很清楚。

讓我們看一下,這負片效果的原始碼,你會更加清楚。

將一個地球的圖片設給 m_bmp,透過上面這個程式範例,畫出來的樣子,就是一張具有負片效果的圖。

灰階效果

負片會了,灰階應該也很簡單了吧!我告訴你,要完成灰階效果,更簡單。ColorMatrix 都幫你將算法寫好了。你只要呼叫 ColorMatrix.setSaturation(0) 即可。

等等,學東西,可不能這樣就含混帶過。別忘了,Android 的原始碼都給你了,我們得利用他追根究柢,一探究竟才行。

打開 ColorMatrix.java 的原始碼,翻到 setSaturation()。這個函式的實現如下:

透過 android.graphics.ColorFilter 與 android.graphics.ColorMatrix,你還可以玩出更多的效果,別忘了 ApiDemos 的範例程式中,也有用到。

很多好東西,就在你身旁,千萬別捨近求遠了。

沒有留言:

張貼留言