绘图绘制阴影算法//AlphaArray俩个数组的值与AlphaArray[j] / 255;到底是啥作用?






/*========================================================================
说明: 在指定的矩形区域内绘制阴影.
==========================================================================*/
void DrawShadow(CDC *pDC, CRect rect)
{
COLORREF oldcolor = RGB(255, 255, 255);
BYTE newValR, newValG, newValB;
BYTE AlphaArray[] = {140, 170, 212, 240};
BYTE AlphaArray2[] = {170, 205, 220, 240, 240, 250, 255};

// 底部的阴影 -----------------------------------------
int i, j;
for (j = 0; j < 4; j++)
{
for (i = 6; i <= rect.right - 5; i++)
{
oldcolor = pDC->GetPixel(i, rect.bottom - (4 - j));
newValR = GetRValue(oldcolor) * AlphaArray[j] / 255;  
newValG = GetGValue(oldcolor) * AlphaArray[j] / 255;  
newValB = GetBValue(oldcolor) * AlphaArray[j] / 255;  
pDC->SetPixel(i, rect.bottom - (4 - j), RGB(newValR, newValG, newValB));
}
}

// 右边的阴影 -----------------------------------------
for (i = 0; i < 4; i++)
{
for (j = 6; j <= rect.bottom - 5; j++)
{
oldcolor = pDC->GetPixel(rect.right - (4 - i), j);
newValR = GetRValue(oldcolor) * AlphaArray[i] / 255;  
newValG = GetGValue(oldcolor) * AlphaArray[i] / 255;  
newValB = GetBValue(oldcolor) * AlphaArray[i] / 255;  
pDC->SetPixel(rect.right - (4 - i), j, RGB(newValR, newValG, newValB));
}
}

// 其他部位的阴影 --------------------------------------
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
if ((i + j) > 6) break;
BYTE alpha = AlphaArray2[i + j];
oldcolor = pDC->GetPixel(rect.right - 4 + i, rect.bottom - 4 + j);
newValR = GetRValue(oldcolor) * alpha / 255;  
newValG = GetGValue(oldcolor) * alpha / 255;  
newValB = GetBValue(oldcolor) * alpha / 255;  
pDC->SetPixel(rect.right - 4 + i, rect.bottom - 4 + j, RGB(newValR, newValG, newValB));

oldcolor = pDC->GetPixel(rect.right - 4 + i, rect.top + 5 - j);
newValR = GetRValue(oldcolor) * alpha / 255;  
newValG = GetGValue(oldcolor) * alpha / 255;  
newValB = GetBValue(oldcolor) * alpha / 255;  
pDC->SetPixel(rect.right - 4 + i, rect.top + 5 - j, RGB(newValR, newValG, newValB));

oldcolor = pDC->GetPixel(rect.left - i + 5, rect.bottom - 4 + j);
newValR = GetRValue(oldcolor) * alpha / 255;  
newValG = GetGValue(oldcolor) * alpha / 255;  
newValB = GetBValue(oldcolor) * alpha / 255;  
pDC->SetPixel(rect.left - i + 5, rect.bottom - 4 + j, RGB(newValR, newValG, newValB));
}
}
}

5 个解决方案

#1


第一个循环,从
pDC->SetPixel(i, rect.bottom - (4 - j), RGB(newValR, newValG, newValB));
得知,它修改的是矩形最底部4行的颜色,把每个像素的颜色都变暗了些。从
BYTE AlphaArray[] = {140, 170, 212, 240};
来看,越靠近底部的颜色越接近原色。

第二个循环不用看了,和第一个道理一样。

第三个循环,修改了三个块,分别是右下角、右上角、左下角,也是变暗一些。
对于右下角来说,越靠近最右下角那个点的地方越亮。


现在回答标题上的问题:
两个数组AlphaArray和AlphaArray2是变暗的比率,0是变为最暗,255是保持原亮度。做成数组是因为要实现渐变的阴影,每一行每一列的变暗比例不同。
GetGValue(oldcolor) * AlphaArray[j] / 255; 的意思是新亮度 = 原有亮度 * 变暗比率,其中实际变暗比率 = AlphaArray[j] / 255,根据行或列的不同来选择变暗比率。

#2


楼上牛人。。。。。。

#3


alpha / 255; //是啥意思呢 牛人
引用 1 楼 fenghou1st 的回复:
第一个循环,从
pDC->SetPixel(i, rect.bottom - (4 - j), RGB(newValR, newValG, newValB));
得知,它修改的是矩形最底部4行的颜色,把每个像素的颜色都变暗了些。从
BYTE AlphaArray[] = {140, 170, 212, 240};
来看,越靠近底部的颜色越接近原色。

第二个循环不用看了,和第一个道理一……


引用 1 楼 fenghou1st 的回复:
第一个循环,从
pDC->SetPixel(i, rect.bottom - (4 - j), RGB(newValR, newValG, newValB));
得知,它修改的是矩形最底部4行的颜色,把每个像素的颜色都变暗了些。从
BYTE AlphaArray[] = {140, 170, 212, 240};
来看,越靠近底部的颜色越接近原色。

第二个循环不用看了,和第一个道理一……

#4


GetRValue(oldcolor) * alpha / 255
这应该是编码者定义的一个算法。使得每个颜色都能相应的变暗,成为阴影效果。
GetRValue(oldcolor)获得RED值,在0-255之间,alpha的值是透明度,也在0-255之间,除以255表示透明比率
这样计算后,每个颜色分量都进行了一个透明比率运算,其结果肯定比原颜色暗;三个分量都变暗,整体就变暗了,阴影效果就出来了。

#5


这种算法,对纯色(红,绿,蓝) 无效。应该 取原色的 色度 矢量,即sqrt(R*R+G*G+B*B).

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号