2011-10-03 76 views
1

我已经使用该算法从Microsoft here像素颜色计算255到0

INT iWidth = bitmap.GetWidth(); 
INT iHeight = bitmap.GetHeight(); 
Color color, colorTemp; 
for(INT iRow = 0; iRow < iHeight; iRow++) 
{ 
    for(INT iColumn = 0; iColumn < iWidth; iColumn++) 
    { 
     bitmap.GetPixel(iColumn, iRow, &color); 
     colorTemp.SetValue(color.MakeARGB(
     (BYTE)(255 * iColumn/iWidth), 
     color.GetRed(), 
     color.GetGreen(), 
     color.GetBlue())); 
     bitmap.SetPixel(iColumn, iRow, colorTemp); 
    } 
} 

创建梯度α混合。他们那张左到右,我需要一个从下往上走,所以我改变了自己的线

(BYTE)(255 * iColumn/iWidth) 

(BYTE)(255 - ((iRow * 255)/iHeight)) 

这使得行0有阿尔法255,通过对具有最后一行字母8.

如何更改计算以使alpha从255变为0(而不是255到8)?

回答

0

f(x) = 255 * (x - 8)/(255 - 8)

其中x是在[8,255]和f(x)是在[0,255]

原始问题可能与,如果具有100的宽度和你迭代水平的事实相关像素,你将只能得到值0到99。因此,99除以100是从来没有1.你需要的是像255*(column+1)/width

0
(BYTE)(255 - 255 * iRow/(iHeight-1)) 

iRow0(iHeight-1)之间,所以如果我们想之间的值。 0和1,我们需要除以(iHeight-1)。我们实际上需要一个介于0和255之间的值,所以我们只需放大255.最后我们要从最大值开始并下降到最小值,所以我们只需从255中减去该值。

在终点:

iRow = 0 
    255 - 255 * 0/(iHeight-1) = 255 
iRow = (iHeight-1) 
    255 - 255 * (iHeight-1)/(iHeight-1) = 255 - 255 * 1 = 0 

请注意,iHeight必须大于或等于2才能正常工作(如果它为1,您将得到一个零除数)。

编辑: 这将导致只有最后一排都为0的alpha值可以得到更均匀的Alpha值的分布

(BYTE)(255 - 256 * iRow/iHeight) 

但是,如果IHEIGHT小于256最后一行不会有0

0

阿尔法值尝试使用以下的计算中的一个(它们给出相同的结果):

(BYTE)(255 - (iRow * 256 - 1)/(iHeight - 1)) 
(BYTE)((iHeight - 1 - iRow) * 256 - 1)/(iHeight - 1)) 

这只适用于使用带符号的部门(您使用类型INT,这似乎与int相同,因此它应该可以工作)。