我一直在使用Microsoft here的算法:
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);
}
}
创建渐变Alpha混合。他们从左到右,我需要一个从下到上,所以我改变了他们的行
(BYTE)(255 * iColumn / iWidth)
到
(BYTE)(255 - ((iRow * 255) / iHeight))
这使得第0行具有alpha 255,直到具有alpha 8的最后一行。
如何更改计算以使alpha从255变为0(而不是255到8)?
答案 0 :(得分: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
答案 1 :(得分:0)
(BYTE)( 255 - 255 * iRow / (iHeight-1) )
iRow
介于0
和(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,则除以零)。
修改强> 这将导致最后一行的alpha值为0.您可以使用
获得更均匀的alpha值分布(BYTE)( 255 - 256 * iRow / iHeight )
但是,如果iHeight小于256,则最后一行的alpha值不会为0.
答案 2 :(得分:0)
尝试使用以下计算之一(它们给出相同的结果):
(BYTE)(255 - (iRow * 256 - 1) / (iHeight - 1))
(BYTE)((iHeight - 1 - iRow) * 256 - 1) / (iHeight - 1))
这只有在使用带符号的除法时才会起作用(使用类型INT
,它似乎与int
相同,所以它应该有效。)