【问题标题】:Algorithm For Bitmap [closed]位图算法[关闭]
【发布时间】:2019-04-17 06:32:14
【问题描述】:

我正在从原始像素数据创建 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 度纹理。所以我宁愿只创建渐变并在色调上叠加渐变。

【问题讨论】:

  • HSL 与不透明度无关。 Alpha 始终是第 4 个独立通道,无论是 RGBA 还是 HSLA
  • 您还可以通过将白色纹理乘以所需颜色来从单个纹理生成任何色调。
  • 要以这种方式使用 alpha,请尝试根据 R0、G0、B0(指定色调的完全饱和颜色)写出 R、G、B 的线性方程,将它们代入alpha 混合公式,并求解 A。
  • 但我仍然会使用乘法将色调应用于灰度纹理。
  • 不确定,但似乎您误解了正确的图像...对我来说,alpha 与其他值无关,您的垂直 alpha 分量逐渐从 1 变为 0,并且独立的水平饱和度/亮度分级跨度>

标签: c++ c algorithm


【解决方案1】:

如果我理解正确,您需要一个带有 alpha 的灰度位图,您可以在任何纯色之上进行组合。

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

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

目标 = WHITE * lum * (1-sat) + RED * lum * sat

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

目标 = 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 时,请注意除法的不稳定性。

【讨论】:

  • 看起来正在应用伽玛调整
猜你喜欢
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
  • 2022-06-16
  • 2010-09-08
  • 1970-01-01
  • 2018-02-13
  • 2011-03-27
相关资源
最近更新 更多