位图算法[关闭]

问题描述 投票:2回答:1

我正在从原始像素数据创建HSL渐变,忽略色调我应该如何根据饱和度和亮度确定不透明度。

还要记住,这有点是一种视错觉,蓝色在图像中,它实际上变得更加透明(基本上是渐变下方有蓝色矩形的渐变)。

            double saturation    =  pixel.x / image.width,
                   luminosity    = 1.0 - ( pixel.y / image.height );

            double alpha_channel = 255.0 * ( 1.0 - ( ( luminosity ) * ( saturation ) ) );

            // Luminosity Channel to fade from white to black.
            double luminosity_amount = 255.0 * ( luminosity );

            // Set the pixels    Red / Green / Blue   Alpha
            pixel.color = color( luminosity_amount , alpha_channel );

结果版本:

正确版本:

.

它变得不那么饱向于右中间。这意味着位图的不透明度更大。

如果有人能够提出一种能够正确淡化alpha通道的饱和度和光度的算法,那就太棒了。

我之所以这样做也是因为我不需要为360度的色调创建360度纹理。所以我宁愿创建渐变并在渐变上层叠渐变。

c++ c algorithm
1个回答
2
投票

如果我理解正确,你需要一个带有alpha的灰度位图,你可以在任何纯色上构图。

轻松完成。想象一下,例如,下面的颜色是红色。然后,您可以计算每个像素所需的颜色。有多种方法可以做到这一点,但您的“正确位图”看起来像这样:

TARGET = lum *(白色*(1-sat)+ RED * sat)

TARGET = WHITE * lum *(1-sat)+ RED * lum * sat

您希望RED组件由透明度提供,而WHITE组件由位图灰色提供:

TARGET = WHITE * gray_level / 255 * alpha / 255 + RED *(1-alpha / 255)

看起来你的alpha部分是正确的:

1-alpha / 255 = lum * sat

alpha =(1 - (lum * sat))* 255

但是,你的灰度级错误:

gray_level / 255 * alpha / 255 = lum *(1-sat)

gray_level = 255 *(lum - (lum * sat))/(1 - (lum * sat))

当lum * sat非常接近1时,要注意除法中的不稳定性。

© www.soinside.com 2019 - 2024. All rights reserved.