15,979
社区成员
发帖
与我相关
我的任务
分享
//调整色调,参数范围:-180~180(度),=0不作调整
//调整饱和度,参数范围0~200(建议,最大值可>200),=100不作调整
//调整亮度,亮度参数范围0~200(建议,最大值可>200),=100不作调整
BOOL dibFilterEFFECT::AdjustHSL(int degHue,int perSaturation,int perLuminosity)
{
if(!m_rdib->Data())
return FALSE;
if(perSaturation < 0 || perLuminosity < 0)
return FALSE;
if(degHue == 0 && perSaturation == 100 && perLuminosity == 100)
return TRUE; //未作调整,直接返回
LPBYTE pRed, pGrn, pBlu,pBuf=(LPBYTE)m_rdib->Data();
UINT loop = m_rdib->Width() * m_rdib->Height();
COLORREF *cr = (COLORREF*)m_rdib->Data();
pRed=pBuf++;pGrn=pBuf++;pBlu=pBuf;
float H,S,L;
for (UINT i=0;i<loop;i++)
{
RGBtoHSL(*pRed,*pGrn,*pBlu,&H,&S,&L);
H += degHue;
S = (S*perSaturation/100.0f);
L = (L*perLuminosity/100.0f);
*cr = HSLtoRGB(H,S,L);
pRed+=4;
pGrn+=4;
pBlu+=4;
cr ++;
}
return TRUE;
}
void dibFilterEFFECT::RGBtoHSL(BYTE R,BYTE G,BYTE B,float* H,float* S,float* L)
{
BYTE minval = min(R,min(G,B));
BYTE maxval = max(R,max(G,B));
float mdiff = float(maxval) - float(minval);
float msum = float(maxval) + float(minval);
*L = msum / 510.0f;
if (maxval == minval)
{
*S = 0.0f;
*H = 0.0f;
}
else
{
float rnorm = (maxval - R) / mdiff;
float gnorm = (maxval - G) / mdiff;
float bnorm = (maxval - B) / mdiff;
*S = (*L <= 0.5f) ? (mdiff / msum) : (mdiff / (510.0f - msum));
if(R == maxval)
*H = 60.0f * (6.0f + bnorm - gnorm);
if(G == maxval)
*H = 60.0f * (2.0f + rnorm - bnorm);
if(B == maxval)
*H = 60.0f * (4.0f + gnorm - rnorm);
if (*H > 360.0f)
*H -= 360.0f;
}
}
COLORREF dibFilterEFFECT::HSLtoRGB(float H,float S,float L)
{
BYTE r,g,b;
L = min(1,L);
S = min(1,S);
if(S == 0.0)
{
r = g = b = (BYTE)(255 * L);
}
else
{
float rm1, rm2;
if (L <= 0.5f)
rm2 = L + L * S;
else
rm2 = L + S - L * S;
rm1 = 2.0f * L - rm2;
r = HueToRGB(rm1, rm2, H + 120.0f);
g = HueToRGB(rm1, rm2, H);
b = HueToRGB(rm1, rm2, H - 120.0f);
}
return RGB(r,g,b);
}
BYTE dibFilterEFFECT::HueToRGB(float rm1,float rm2,float rh)
{
while(rh > 360.0f)
rh -= 360.0f;
while(rh < 0.0f)
rh += 360.f;
if(rh < 60.0f)
rm1 = rm1 + (rm2 - rm1) * rh / 60.0f;
else if(rh < 180.0f)
rm1 = rm2;
else if(rh < 240.0f)
rm1 = rm1 + (rm2 - rm1) * (240.0f - rh) / 60.0f;
float n = rm1*255;
int m = min((int)n,255);
m = max(0,m);
return (BYTE)m;
}
LRESULT RingTrackBarEx::RingdowProc(HWND hWnd,RINGPARAMS param)
{
switch(param.uMsg)
{
case WM_PRINTCLIENT:
case WM_PAINT:
{
RECT rc,rcc;
HDC hdc,hMemDC;
PAINTSTRUCT ps;
GetWindowRect(m_hWnd,&rc);
OffsetRect(&rc,-rc.left,-rc.top);
hdc = param.wParam?(HDC)param.wParam:BeginPaint(hWnd,&ps);
FillRect(hdc,&rc,m_brush);
hMemDC = CreateCompatibleDC(hdc);
SelectObject(hMemDC,m_hbmLine);
GetChannelRect(&rcc);
StretchBlt(hdc,rcc.left,(rc.bottom - m_sizeLine.cy)/2,rcc.right-rcc.left,m_sizeLine.cy,
hMemDC,0,0,m_sizeLine.cx,m_sizeLine.cy,SRCCOPY);
SelectObject(hMemDC,m_hbmThumb);
GetThumbRect(&rc);
BitBlt(hdc,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top,hMemDC,0,0,SRCCOPY);
DeleteDC(hMemDC);
if(param.wParam == 0)
EndPaint(hWnd, &ps);
return 0;
}
}
return DefaultProc(param);
}