포토샵 이미지 밝기/대비 조정 원리를 간략하게 소개합니다:
1. 대비 알고리즘 공식.
Photoshop은 주어진 값의 양수 값과 음수 값에 따라 대비 증가분을 각각 처리합니다.
newRGB를 사용하여 이미지 픽셀의 새로운 R, G, B 구성 요소를 나타내는 경우 RGB는 이미지 픽셀의 R, G, B 구성 요소를 나타내며 Threshold는 지정된 임계값이고 Contrast는 대비 증가분. 대비가 0보다 큰 경우:
1) newRGB = RGB + (RGB - 임계값) * (1 / (1 - 대비 / 255) - 1)
여기서 , Contrast가 255(RGB - Threshold ) * (1 / (1 - Contrast / 255) - 1)과 같을 때 RGB의 최대값과 최소값은 각각 255와 0이므로 newRGB는 무한대(±)가 됩니다. Threshold에 의해서만 결정됩니다. 즉, newRGB = RGB >= Threshold ? 255:0입니다. 이는 실제로 이미지 임계값을 설정하는 것입니다. 즉, 이미지는 빨간색, 노란색, 녹색, 청록색, 파란색 등 최대 8가지 색상으로 구성됩니다. 보라색, 검정색, 흰색 회색조 이미지에는 최대 8개의 선만 있습니다.
Contrast가 0보다 작은 경우:
2) newRGB = RGB + (RGB - Threshold) * Contrast / 255
그중 Contrast가 -255인 경우 , 이미지 RGB 각 구성 요소는 임계값과 동일하고 이미지는 완전히 회색이며 회색조 이미지에는 임계값 회색조인 단 하나의 선만 있습니다.
2. 이미지 밝기 조정. 이 문서에서는 가장 일반적으로 사용되는 비선형 밝기 조정을 사용합니다(이 밝기 조정 방법은 Photoshop CS3 이하 버전에서도 사용되며 CS3 이상 버전에서도 이 밝기 조정 방법 옵션이 유지됩니다).
3. 영상 밝기/대비 종합 조정 알고리즘. 이는 매우 간단합니다. 밝기와 대비를 동시에 조정할 때 대비가 0보다 크면 지금 밝기를 조정하고, 대비가 0보다 작으면 그 반대가 됩니다. 대비를 먼저 조정한 다음 밝기를 조정합니다.
다음은 예제 코드를 포함하여 BCB2007 및 GDI+ 비트맵 데이터를 사용하여 작성된 Photoshop 이미지 밝기/대비 조정을 위한 전체 코드입니다.
//-- - ------------------------------------------------- - ----------
// ARGB 픽셀 구조 정의
typedef 공용체
{
ARGB Color;
struct
{
BYTE Blue;
BYTE Green;
BYTE Red;
BYTE Alpha;
};
}ARGBQuad, *PARGBQuad;
//------------ - ------------------------------------------------- - ----------
//-------------------------------------- -------------
FORCEINLINE
INT CheckValue(INT 값)
{
return 값 <= 0? 0 : 값 >= 255? 255 : 값;
}
//---------------- ------------------------------------- ---------
VOID BrightAndContrast(BitmapData *data, INT bright, INT contrast, BYTE threshold)
{
FLOAT cv = 대비 <= -255? -1.0f : 대비 / 255.0f;
if (대비 >0 && 대비 < 255 )
cv = 1.0f / (1.0f - cv) - 1.0f;
BYTE 값[256];
(INT i = 0; i < 256; i ++)
{
INT v = 대비 > 0? CheckValue(i + 밝음) : i;
if (대비 >= 255)
v = v >= 임계값? 255 : 0;
else
v = CheckValue(v + (INT)((v - 임계값) * cv + 0.5f));
값[i] = 대비 < 0? CheckValue(v + 밝음) : v;
}
PARGBQuad p = (PARGBQuad)data->Scan0;
INT offset = data->Stride - data->Width * sizeof(ARGBQuad);
for (UINT y = 0; y < data->Height; y ++, (BYTE *)p += 오프셋)
{
for (UINT x = 0; x < data->Width; x ++, p ++)
{
p->파란색 = 값[p->파란색];
p->녹색 = 값[p->녹색];
p-& gt;빨간색 = 값 [p->빨간색];
}
}
}
//----------------------------------------- ------ ----------
// GDI+ 비트맵 스캔라인을 데이터에 잠금
FORCEINLINE
VOID LockBitmap(Gdiplus::Bitmap *bmp, BitmapData *data)
{
Gdiplus::Rect r(0, 0, bmp->GetWidth(), bmp->GetHeight());
bmp-> ;LockBits( &r, ImageLockModeRead | ImageLockModeWrite,
PixelFormat32bppARGB, 데이터);
}
//--------------- - ------------------------------------------------- - -------
// 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 데이터;
LockBitmap(bmp, &data);
BrightAndContrast(&data, 0, 100, 121);
UnlockBitmap(bmp, &data);
g->DrawImage(bmp, data.Width, 0) ;
g 삭제;
bmp 삭제;
}
//---------------- ------------------------------------- ---------
밝기/대비 조정 기능인 BrightAndContrast에서는 앞서 소개한 원리에 따라 먼저 256개 요소의 룩업 테이블을 생성한 후 이미지 데이터를 처리한다. 조정된 데이터는 R, G, B 성분 값에 따라 룩업 테이블에서 얻어지므로 처리 속도가 상당히 빠릅니다.
Photoshop 이미지 밝기/대비 조정 관련 기사를 더 보려면 PHP에 주목하세요. 중국사이트!