自從上一篇博客寫完之后,到現在已經有段時間了,這段時間不是不想接著寫,只是想做的更好了在寫出來給大家看呵呵。
??? 今天,我將給大家介紹制作圖像濾鏡的基礎,也就是PS中的基本命令如何用代碼實現,這里包括各種混合圖層,去色命令,亮度對比度調整,飽和度調整以及曲線調整等,這些命令都是最基礎的,如果我們掌握了這些知識,那么,一些復雜的濾鏡也就有穩定的根基了。
##1,混合圖層
??? PS中,混合圖層是制作濾鏡的必需品,他包括了正常模式,溶解模式,變暗模式,正片疊底,顏色加深,線性加深,深色模式,變亮模式,濾色模式,顏色減淡,線性減淡,淺色模式,疊加模式,柔光模式,強光模式,亮光模式,線性光,點光,實色混合,插值模式,排除模式,減去模式,劃分模式,色相,飽和度,顏色,明度等。
??? 這些混合模式的原理及公示計算如下(來自網絡總結):
????**正常模式**:混合色*不透明度+(100%-混合色不透明度)*基色
????**溶解模式**:溶解模式下混合色的不透明度及填充都是100%的話,我們就看不到基色圖層。降低混合色圖層的不透明度后,我們就會發現結果色中出現了很多細小的顆粒。這些顆粒會隨著混合色的不透明度變化。不透明度越低混合色圖層就被溶解的越多。剩下的部分就越少。不透明度越高混合色圖層被溶解的部分就越少,剩下的部分就越多,結果色就越接近混合色。
????**變暗模式**:變暗混合模式下,她會把混合色與基色進行對比,分別選擇R,G,B三組數值中最小的數值,也就是最暗的顏色作為結果色的數值。這樣整個畫面會變得更暗,如果是彩色圖像,顏色也會發生很大的改變。(位置互換不發生變化)
????**正片疊底**:正片疊底混合原理:她是按照混合色與基色中的各R,G,B值計算,計算公式:結果色R=混合色R *?基色R / 255,G值與B值同樣的方法計算。最后得到的R,G,B值就是結果色的顏色。由于各通道的最大值是255,因此結果色的數值比混合色及基色的數值都要小,也就是結果色要暗。(位置互換不發生變化)
????**顏色加深**:顏色加深可以快速增加圖片的暗部。她的計算公式:結果色?=(基色?+?混合色?- 255)* 255 /混合色。其中(基色?+混合色?- 255)如果出現負數就直接歸0。因此在基色與混合色都較暗的時候都是直接變成黑色的。這樣結果色的暗部就會增加。整體效果看上去對比較為強烈。
????**線性加深**:線性加深的計算公式是:結果色?=基色?+混合色?- 255,如果基色?+混合色的數值小于255,結果色就為0。由這個公式可以看出,畫面暗部會直接變成黑色。因此畫面整體會更暗。白色與基色混合得到基色,黑色與基色混合得到黑色。(位置互換不發生變化)
????**深色模式**:深色混合模式比較好理解。它是通過計算混合色與基色的所有通道的數值,然后選擇數值較小的作為結果色。因此結果色只跟混合色或基色相同,不會產生出另外的顏色。白色與基色混合色得到基色,黑色與基色混合得到黑色。深色模式中,混合色與基色的數值是固定的,我們顛倒位置后,混合色出來的結果色是沒有變化的。
????**變亮模式**:變亮模式跟變暗模式是相對的,她是通過混合色與基色的相關數值進行比較,選擇較大的數值作為結果色。因此結果色會更亮,同時顏色也會變化。(位置互換不發生變化)
????**濾色模式**:濾色模式與正片疊底模式相對。她的計算公式是用:255 -混合色的補色?*?基色補色?/ 255。得到的數據會比混合及基色更大,因此結果色會更亮。從計算公式也可以看出基色或混合色任何一項為255也就是白色,結果色數值就是255為白色。任何一項數值為0,也就是為黑色的話,結果色就跟數值不為0的一致。
????**顏色減淡**:顏色減淡是通過混合色及基色的各通道顏色值進行對比,減少二者的對比度使基色的變亮來反映混合色。
她的計算公式:結果色 = 基色 + (混合色 * 基色) / (255 - 混合色)。混合色為黑色,結果色就等于基色,混合色為白色結果色就為白色。基色為黑色結果色就為黑色。
????**線性減淡**:線性減淡是通過查看每個通道的顏色信息,并通過增加亮度使基色變亮以反映混合色。她的計算公式:結果色?=?基色?+混合色,其中基色與混合色的數值大于255,系統就默認為最大值也就是255。
由公式可以分析出混合色為黑色結果色就等于基色,混合色為白色結果色就為白色。基色也一樣。我們顛倒混合色及基色的位置,結果色也不會變化。(位置互換不發生變化)
????**淺色模式**:淺色模式比較好理解:她是通過計算混合色與基色所有通道的數值總和,哪個數值大就選為結果色。因此結果色只能在混合色與基色中選擇,不會產生第三種顏色。與深色模式剛好相反。
????**疊加**:疊加模式比較特別,她是通過分析基色個通道的數值,對顏色進行正片疊加或濾色混合,結果色保留基色的明暗對比。因此結果色以基色為主導。
??? 計算公式:
基色?:結果色?=混合色?*基色?/ 128;基色?> 128:結果色?= 255 -?(255 -混合色)* (255 -基色) / 128。
從公式可以看出,結果色會根據基色的顏色數值選擇不同的計算公式。
????**柔光模式**:柔光模式是較為常用的模式,她是根據混合色的通道數值選擇不同的公式計算混合色。數值大于128的時候,結果色就比基色稍亮;數值小于或等于128,結果色就比基色稍暗。柔光模式是以基色為主導,混合色只相應改變局部明暗。其中混合色為黑色,結果色不會為黑色,只比結果色稍暗,混合色為中性色,結果色跟基色一樣。
計算公式:
混合色?:結果色?=基色?+ (2 *混合色?- 255) * (基色?-基色?*基色?/ 255) / 255;
混合色?>128:結果色?=?基色?+ (2 *混合色?- 255) * (Sqrt(基色/255)*255 -基色)/255。
????**強光模式**:強光模式跟疊加模式十分類似,只是在計算的時候需要通過混合色來控制,混合色的數值小于或等于128的時候,顏色會變暗;混合色的數值大于128的時候,顏色會變亮。混合色為白色,結果色就為白色;混合色為黑色,結果為黑色。混合色起到主導作用。
計算公式:
混合色?:結果色?=混合色?*基色?/ 128;
混合色?> 128:結果色?= 255 -(255 -混合色)?* (255 -基色) / 128.
????**亮光模式**:亮光模式是通過增加或減少對比度是顏色變暗或變亮,具體取決于混合色的數值。混合色比中性灰色暗,結果色就相應的變暗,混合色比中性灰色亮,結果色就相應的變亮。有點類似顏色加深或顏色減淡。
計算公式:
A---基色;B—混合色
C=A-(255-A)*(255-2B)/2B?當混合色>128時?
C=A+[A*(2B-255)]/[255-(2B-255)
????**線性光**:線性光:通過減少或增加亮度,來使顏色加深或減淡。具體取決于混合色的數值。混合色數值比中性灰色暗的時候進行相應的加深混合;混合色的數值比中性灰色亮的時候進行減淡混合。這里的加深及減淡時線性加深或線性減淡。
計算公式:結果色?= 2 *混合色?+基色?-255。數值大于255取255。
????**點光**:點光模式:她會根據混合色的顏色數值替換相應的顏色。如果混合色數值小于中性灰色,那么就替換比混合色亮的像素;相反混合色的數值大于中性灰色,則替換比混合色暗的像素。因此混合出來的顏色對比較大。
計算公式:
基色?混合色?- 255:結果色?= 2 *混合色?- 255;
2 *?混合色?- 255 基色?混合色:結果色?=基色;
基色?> 2 *混合色:結果色?= 2 *混合色。
????**實色混合**:實色混合是把混合色顏色中的紅、綠、藍通道數值,添加到基色的RGB值中。結果色的R、G、B通道的數值只能是255或0。因此結構色只有一下八種可能:紅、綠、藍、黃、青、洋紅、白、黑。由此看以看出結果色是非常純的顏色。
計算公式:
混合色+?基色 = 255:結果色= 255。
????**差值模式**:差值模式:查看每個通道的數值,用基色減去混合色或用混合色減去基色。具體取決于混合色與基色那個通道的數值更大。白色與任何顏色混合得到反相色,黑色與任何顏色混合顏色不變。
計算公式:
結果色?=絕對值(混合色?-基色)
????**排除模式**:排除模式是跟差值模式非常類似的混合模式,只是排除模式的結果色對比度沒有差值模式強。白色與基色混合得到基色補色,黑色與基色混合得到基色。
計算公式:
結果色?= (混合色?+基色) -混合色?*基色?/ 128。
????**減去模式**:減去模式:查看各通道的顏色信息,并從基色中減去混合色。如果出現負數就剪切為零。與基色相同的顏色混合得到黑色;白色與基色混合得到黑色;黑色與基色混合得到基色。
計算公式:
結果色?=基色?-混合色。
????**劃分模式**:劃分模式:超看每個通道的顏色信息,并用基色分割混合色。基色數值大于或等于混合色數值,混合出的顏色為白色。基色數值小于混合色,結果色比基色更暗。因此結果色對比非常強。白色與基色混合得到基色,黑色與基色混合得到白色。
計算公式:
結果色?= (基色?/混合色) * 255。
????**色相**:色相混合模式:結果色保留混合色的色相,飽和度及明度數值保留明度數值。這里用到的色相、飽和度、明度也是一種顏色模式,也稱作:HSB模式。色相代表顏色的顏色相貌,也就是我們看到的紅、綠、藍等;飽和度是顏色的飽和程度,也就是鮮艷度;明度是顏色的明暗程度。其中黑色、灰色、白色是沒有顏色和飽和度的,也就是相關數值為0。
????**飽和度模式**:飽和度模式是用混合色的飽和度以及基色的色相和明度創建結果色。我們都知道飽和度只控制顏色的鮮艷程度,因此混合色只改變圖片的鮮艷度,不能影響顏色。黑、白、灰除外,因為這些顏色的飽和度為0,混合后只能產生一種灰色效果。
????**顏色模式**:顏色模式是用混合色的色相,飽和度以及基色的明度創建結果色。這種模式下混合色控制真個畫面的顏色,是黑白圖片上色的絕佳模式,因為這種模式下會保留基色圖片也就是黑白圖片的明度度。黑、白、會與基色混合會產生相同的灰色效果,因為這三種顏色的色相,飽和度都是0。
????**明度模式**:明度混合模式是利用混合色的明度以及基色的色相與飽和度創建結果色。她跟顏色模式剛好相反,因此混合色圖片只能影響圖片的明暗度,不能對基色的顏色產生影響,黑、白、灰除外。黑色與基色混合得到黑色;白色與基色混合得到白色;灰色與基色混合得到明暗不同的基色。
##2,去色命令
????PS里的**去色命令**:每個像素R、G、B三個值中最大值和最小值和的一半,作為最后灰度值輸出;
##3,亮度對比度命令
??? 對于零度對比度命令,網絡中介紹的最詳細的是這個博客鏈接,我就不在重述了?[?http://blog.csdn.net/maozefa/article/details/1776824](http://blog.csdn.net/maozefa/article/details/1776824)
## 4,飽和度命令
??? 對于飽和度、色相命令,網絡中介紹最詳細的是這個博客鏈接,?[http://blog.csdn.net/maozefa/article/details/8461849](http://blog.csdn.net/maozefa/article/details/8461849)
## 5,曲線命令
??? 曲線命令看起來比較復雜,實際上只是幾個參數而已,網絡中詳細介紹的鏈接:[http://blog.csdn.net/laviewpbt/article/details/17162849](http://blog.csdn.net/laviewpbt/article/details/17162849)
??? 以上是我們只做一款優秀濾鏡比不可少的知識,言歸正傳,今天我主要給大家提供一個C#/C的DEMO,代碼中實現了以上基本功能,大家可以理解知識之后自己編碼,也可以直接使用我的DEMO中的庫(SpecialEffect.dll),或者是C#的SpecialEffectClass.cs,簡單放上一些調用代碼:
~~~
public static Bitmap DoLevelAdjust(Bitmap srcBitmap, int DestChannel, int InputLeftLimit, int InputMiddle, int InputRightLimit, int OutputLeftLimit, int OutputRightLimit, int pxMode)
{
Bitmap src = new Bitmap(srcBitmap);
int w = src.Width;
int h = src.Height;
PixelFormat format = (pxMode == 0 ? PixelFormat.Format24bppRgb : PixelFormat.Format32bppArgb);
BitmapData srcData = src.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, format);
LevelAdjust((byte*)srcData.Scan0, w, h, srcData.Stride, DestChannel, InputLeftLimit, InputMiddle, InputRightLimit, OutputLeftLimit, OutputRightLimit,pxMode);
src.UnlockBits(srcData);
return src;
}
public static Bitmap DoSaturationAdjust(Bitmap srcBitmap, int pxMode,int saturation)
{
Bitmap src = new Bitmap(srcBitmap);
int w = src.Width;
int h = src.Height;
PixelFormat format = (pxMode == 0 ? PixelFormat.Format24bppRgb : PixelFormat.Format32bppArgb);
BitmapData srcData = src.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, format);
SaturationProcess((byte*)srcData.Scan0, w, h, srcData.Stride, pxMode,saturation);
src.UnlockBits(srcData);
return src;
}
public static Bitmap DoBrightContrastAdjust(Bitmap srcBitmap, int pxMode, int brightness,int contrast,int threshold)
{
Bitmap src = new Bitmap(srcBitmap);
int w = src.Width;
int h = src.Height;
PixelFormat format = (pxMode == 0 ? PixelFormat.Format24bppRgb : PixelFormat.Format32bppArgb);
BitmapData srcData = src.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, format);
BrightContrastProcess((byte*)srcData.Scan0, w, h, srcData.Stride, pxMode, brightness, contrast, threshold);
src.UnlockBits(srcData);
return src;
}
public static Bitmap DoGrayEffect(Bitmap srcBitmap, int pxMode)
{
Bitmap src = new Bitmap(srcBitmap);
int w = src.Width;
int h = src.Height;
PixelFormat format = (pxMode == 0 ? PixelFormat.Format24bppRgb : PixelFormat.Format32bppArgb);
BitmapData srcData = src.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, format);
Desaturate((byte*)srcData.Scan0, w, h, srcData.Stride, pxMode);
src.UnlockBits(srcData);
return src;
}
~~~
**最后,分享一個專業的圖像處理網站(微像素),里面有很多源代碼下載:**
[http://www.zealpixel.com/portal.php](http://www.zealpixel.com/portal.php)
- 前言
- 序言
- Brannan濾鏡
- 編碼基礎(Photoshop基礎變換的代碼實現)
- Toaster濾鏡
- Hudson濾鏡(Instagram)
- 暴雨濾鏡
- 大雪濾鏡
- 圖像濾鏡實現萬能方法研究
- 大霧效果濾鏡
- 連環畫濾鏡
- 暗調濾鏡
- 懷舊風格濾鏡
- (Nostalgla Filter)老照片濾鏡
- (Punch Filter)交叉沖印濾鏡
- (Lightleaks Filter)漏光濾鏡
- 漫畫濾鏡
- LOMO Filter
- Glow Filter發光濾鏡
- (Instagram)1977濾鏡
- (Sketch Filter)素描濾鏡
- 水彩畫濾鏡
- 圖像光照效果濾鏡
- Oilpaint油畫濾鏡
- Swirl濾鏡
- Wave濾鏡
- 球面(Spherize)濾鏡
- 擠壓(Pinch)濾鏡
- 旋轉模糊濾鏡
- 霓虹、浮雕、木刻濾鏡
- 圖像濾鏡暈影調節算法研究
- PS平均(濾鏡-模糊-平均)效果
- Photoshop實現Instagram Amaro濾鏡特效
- Photoshop實現Instagram之Nashville濾鏡
- Photoshop實現Instagram之Sierra濾鏡
- Photoshop實現Instagram之Mayfair濾鏡效果
- ZPhotoEngine超級算法庫
- 樂高像素拼圖特效
- 樂高像素拼圖特效濾鏡的代碼實現
- 保留細節的磨皮濾鏡之PS實現
- 保留細節的磨皮之C#程序實現
- 流行藝術風濾鏡特效PS實現
- PS圖層混合模式之明度模式