像素颜色计算255到0

时间:2011-10-03 07:29:28

标签: c++ math colors gdi+

我一直在使用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)?

3 个答案:

答案 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相同,所以它应该有效。)