簡單介紹一下Photoshop影像亮度/對比調整的原理:
一、對比演算法公式。
Photoshop對於對比度增量,是按給定值的正負分別處理的。
若以newRGB表示影像像素新的R、G、B分量,RGB表示影像像素R、G、B分量,Threshold為給定的閥值,Contrast為對比度增量,當Contrast大於0時:
1) newRGB = RGB + (RGB - Threshold) * (1 / (1 - Contrast / 255) - 1)
其中,當Contrast等於255時(RGB - Threshold) * (1 / (1 - Contrast / 2555) - 1)為無限(±),由於RGB最大最小值分別為255和0,因此,只能按Threshold來確定newRGB,即newRGB = RGB >= Threshold? 255 : 0,這實際上就是設定影像閥值,影像由最多八種顏色組成,分別為紅、黃、綠、青、藍、紫及黑與白,在灰階圖上也只有最多8條線。
當Contrast小於0時:
2) newRGB = RGB + (RGB - Threshold) * Contrast / 255
灰階圖上只有1條線,即閥值灰階。
二、影像亮度調整。本文採用的是最常用的非線性亮度調整(Phoposhop CS3以下版本也是這種亮度調整方式,CS3以上版本也保留了此亮度調整方式的選項)。
三、影像亮度/對比綜合調整演算法。這個很簡單,當亮度、對比同時調整時,如果對比度大於0,現調整亮度,再調整對比度;當對比度小於0時,則相反,先調整對比度,再調整亮度。
以下是使用BCB2007和GDI+點陣圖資料寫的Photoshop影像亮度/對比調整全部程式碼,包含範例程式碼:
//----------------- -------------------------------------------------- --------
// 定義ARGB像素結構
typedef union
{
BYTE Blue;
BYTE Green; BYTE Red; BYTE Alpha;
};
}ARGBQuad, *PARGBQuad;
//
------------------------------ ---------------------------------------------
//-------------------------------------------- ------------ -------------------------------
FORCEINLINE
INT CheckValue(INT value)
{
return值0? 0 : 值 >= 255? 255 : 值;
}
//---------------------------------- -------------- ------------------------------------ -----------------
VOID BrightAndContrast(BitmapData *資料、INT 亮度、INT 對比、BYTE 門檻)
{
FLOAT cv = 對比度 FLOAT cv = 對比 ? -1.0f : 對比 / 255.0f;
if (對比 > cv = 1.0f / (1.0f - 履歷) -
1.0f ; BYTE 值[256];
for
(INT i { INT v = 對比> 0
? CheckValue(i + bright) : i; if (對比 >= 255 :
0
; else
+ 0.5f)); 值s[i] = 對比0 ? CheckValue(v + bright) : v; } PARGBQuad p = (PARGBQuad)data->Scan0;
(ARGBQuad);
for (UINT y = 0
; y 高度; y ++, (BYTE*)p += 偏移) 0
; x 寬度; x ++, p ++)
{
p- p->綠色 = 值[p->綠色];
p ->紅色 值[p ->紅色]; } }
}
//--------------------------------------------- ------------------------------
// 鎖定GDI+位位圖掃描線到data
FORCEINLINE
VOID LockBitmap(Gdiplus::Bitmap *bmp, BitmapData *data)
{
Gdiplus::Rect h )); bmp->LockBits(&r, ImageLockModeRead | ImageLockModeWrite, PixelFormat32bppARGB, data);----------------/
/
--------------------------------------------------
//
GDI+位圖掃描線解鎖
FORCEINLINEVOID UnlockBitmap(Gdiplus::Bitmap *bmp, BitmapData *data){ bmp->UnlockBits(data);
}
/ /
----------------------------------------------- ----------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{ Gdiplus ::Bitmap *bmp =
new Gdiplus::Bitmap(L"
d:\source.jpg"::); Handle); g->DrawImage(bmp, 0, 0);
Bitmap data;Andcophip 美元 它(&data, 0,
100, 121) ; UnlockBitmap(bmp, &data);
g->DrawImage(bmp, data.Width,
//------- -------------------------------------------------- ------------------ 在亮度/對比度調整函數BrightAndContrast中,首先按前面介紹的原理製造了一個256個元素大小的查找表,然後對圖像資料逐像素按R、G、B分量值在查找表中取得調整後的數據,因此處理速度相當快。
更多Photoshop影像亮度/對比調整 相關文章請關注PHP中文網!