Closed. This question needs details or clarity。它当前不接受答案。












想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。

去年关闭。



Improve this question




我正在根据原始像素数据创建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纹理。因此,我宁愿只创建渐变并将渐变叠加在色调上。

最佳答案

如果我对您的理解正确,则需要带有alpha的灰度位图,并且可以在任何纯色的基础上进行合成。

轻松完成。假设下面的颜色是红色。然后,您可以计算每个像素所需的颜色。有多种方法可以执行此操作,但是您的“正确位图”如下所示:

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

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

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

目标=白色* grey_level / 255 * alpha / 255 +红色*(1-alpha / 255)

看起来您的Alpha部分正确:

1-alpha / 255 = lum *饱和

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时,请小心除法中的不稳定性。

关于c++ - 位图算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55721267/

10-09 13:32