一、對比度算法公式。
Photoshop對于對比度增量,是按給定值的正負(fù)分別處理的。
如果用newRGB表示圖像像素新的R、G、B分量,RGB表示圖像像素R、G、B分量,Threshold為給定的閥值,Contrast為對比度增量,當(dāng)Contrast大于0時:
1) newRGB = RGB + (RGB - Threshold) * (1 / (1 - Contrast / 255) - 1)
其中,當(dāng)Contrast等于255時(RGB - Threshold) * (1 / (1 - Contrast / 255) - 1)為無限(±),由于RGB最大最小值分別為255和0,因此,只能按Threshold來確定newRGB,即newRGB = RGB >= Threshold? 255 : 0,這實(shí)際就是設(shè)置圖像閥值,圖像由最多八種顏色組成,即紅、黃、綠、青、藍(lán)、紫及黑與白,在灰度圖上也只有最多8條線。
當(dāng)Contrast小于0時:
2) newRGB = RGB + (RGB - Threshold) * Contrast / 255
其中,當(dāng)Contrast等于-255時,圖像RGB各分量都等于閥值,圖像呈全灰色,灰度圖上只有1條線,即閥值灰度。
二、圖像亮度調(diào)整。本文采用的是最常用的非線性亮度調(diào)整(Phoposhop CS3以下版本也是這種亮度調(diào)整方式,CS3及以上版本也保留了該亮度調(diào)整方式的選項(xiàng))。
三、圖像亮度/對比度綜合調(diào)整算法。這個很簡單,當(dāng)亮度、對比度同時調(diào)整時,如果對比度大于0,現(xiàn)調(diào)整亮度,再調(diào)整對比度;當(dāng)對比度小于0時,則相反,先調(diào)整對比度,再調(diào)整亮度。
下面是用BCB2007和GDI+位圖數(shù)據(jù)寫的Photoshop圖像亮度/對比度調(diào)整全部代碼,包括例子代碼:
//---------------------------------------------------------------------------
// 定義ARGB像素結(jié)構(gòu)
typedef union
{
ARGB Color;
struct
{
BYTE Blue;
BYTE Green;
BYTE Red;
BYTE Alpha;
};
}ARGBQuad, *PARGBQuad;
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
FORCEINLINE
INT CheckValue(INT value)
{
return value <= 0? 0 : value >= 255? 255 : value;
}
//---------------------------------------------------------------------------
VOID BrightAndContrast(BitmapData *data, INT bright, INT contrast, BYTE threshold)
{
FLOAT cv = contrast <= -255? -1.0f : contrast / 255.0f;
if (contrast > 0 && contrast < 255)
cv = 1.0f / (1.0f - cv) - 1.0f;
BYTE values[256];
for (INT i = 0; i < 256; i ++)
{
INT v = contrast > 0? CheckValue(i + bright) : i;
if (contrast >= 255)
v = v >= threshold? 255 : 0;
else
v = CheckValue(v + (INT)((v - threshold) * cv + 0.5f));
values[i] = contrast < 0? CheckValue(v + bright) : v;
}
PARGBQuad p = (PARGBQuad)data->Scan0;
INT offset = data->Stride - data->Width * sizeof(ARGBQuad);
for (UINT y = 0; y < data->Height; y ++, (BYTE*)p += offset)
{
for (UINT x = 0; x < data->Width; x ++, p ++)
{
p->Blue = values[p->Blue];
p->Green = values[p->Green];
p->Red = values[p->Red];
}
}
}
//---------------------------------------------------------------------------
// 鎖定GDI+位位圖掃描線到data
FORCEINLINE
VOID LockBitmap(Gdiplus::Bitmap *bmp, BitmapData *data)
{
Gdiplus::Rect r(0, 0, bmp->GetWidth(), bmp->GetHeight());
bmp->LockBits(&r, ImageLockModeRead | ImageLockModeWrite,
PixelFormat32bppARGB, data);
}
//---------------------------------------------------------------------------
// GDI+位圖掃描線解鎖
FORCEINLINE
VOID 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");
Gdiplus::Graphics *g = new Gdiplus::Graphics(Canvas->Handle);
g->DrawImage(bmp, 0, 0);
BitmapData data;
LockBitmap(bmp, &data);
BrightAndContrast(&data, 0, 100, 121);
UnlockBitmap(bmp, &data);
g->DrawImage(bmp, data.Width, 0);
delete g;
delete bmp;
}
//---------------------------------------------------------------------------
在亮度/對比度調(diào)整函數(shù)BrightAndContrast中,首先按前面介紹的原理制造了一個256個元素大小的查找表,然后對圖像數(shù)據(jù)逐像素按R、G、B分量值在查找表中取得調(diào)整后的數(shù)據(jù),因此處理速度相當(dāng)快。
更多Photoshop圖像亮度/對比度調(diào)整 相關(guān)文章請關(guān)注PHP中文網(wǎng)!
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com