如何获得平滑的颜色变化?

时间:2013-07-25 02:39:44

标签: c# colors dwm

在c#中将一种颜色平滑地改变为另一种颜色的最佳方法是什么。 我的程序会根据电池电量更改用户的配色方案。

我目前的代码          private void greater75_Tick(object sender, EventArgs e)         {

        if (Environment.OSVersion.Version.Major >= 6 && DwmIsCompositionEnabled())
        {
            PowerStatus ps = SystemInformation.PowerStatus;
            if (ps.BatteryLifePercent >= 0.75)
            {
                ChangeCol.clrAfterGlow = 5;
                ChangeCol.clrColor = ColorToBgra(Color.Green);
                ChangeCol.nIntensity += 1;
                DwmSetColorizationParameters(ref ChangeCol, false);
            }
            if (ps.BatteryLifePercent < 0.75)
            {
                ChangeCol.clrAfterGlow = 5;
                ChangeCol.clrColor = ColorToBgra(Color.Blue);
                ChangeCol.nIntensity += 1;
                DwmSetColorizationParameters(ref ChangeCol, false);
            }
        }
    }

此代码使用此结构和方法来修改用户的系​​统颜色。

感谢this guythis other guy

    public DWM_COLORIZATION_PARAMS ChangeCol;
    public struct DWM_COLORIZATION_PARAMS
    {
        public uint clrColor;
        public uint clrAfterGlow;
        public uint nIntensity;
        public uint clrAfterGlowBalance;
        public uint clrBlurBalance;
        public uint clrGlassReflectionIntensity;
        public bool fOpaque;
    }


    [DllImport("dwmapi.dll", EntryPoint = "#127", PreserveSig = false)]
    private static extern void DwmGetColorizationParameters(out DWM_COLORIZATION_PARAMS parameters);

    [DllImport("dwmapi.dll", EntryPoint = "#131", PreserveSig = false)]
    private static extern void DwmSetColorizationParameters(ref DWM_COLORIZATION_PARAMS parameters,
                                                            bool unknown);

    // Helper method to convert from a Win32 BGRA-format color to a .NET color.
    private static Color BgraToColor(uint color)
    {
        return Color.FromArgb(Int32.Parse(color.ToString("X"), NumberStyles.HexNumber));
    }

    // Helper method to convert from a .NET color to a Win32 BGRA-format color.
    private static uint ColorToBgra(Color color)
    {
        return (uint)(color.B | (color.G << 8) | (color.R << 16) | (color.A << 24));
    }
    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern bool DwmIsCompositionEnabled();
    // Gets or sets the current color used for DWM glass, based on the user's color scheme.

    public static Color ColorizationColor
    {
        get
        {
            // Call the DwmGetColorizationParameters function to fill in our structure.
            DWM_COLORIZATION_PARAMS parameters;
            DwmGetColorizationParameters(out parameters);

            // Convert the colorization color to a .NET color and return it.
            return BgraToColor(parameters.clrColor);
        }
        set
        {
            // Retrieve the current colorization parameters, just like we did above.
            DWM_COLORIZATION_PARAMS parameters;
            DwmGetColorizationParameters(out parameters);

            // Then modify the colorization color.
            // Note that the other parameters are left untouched, so they will stay the same.
            // You can also modify these; that is left as an exercise.
            parameters.clrColor = ColorToBgra(value);

            // Call the DwmSetColorizationParameters to make the change take effect.
            DwmSetColorizationParameters(ref parameters, false);
        }
    }

问题在于,当设置一个颜色,并且在将其设置为0后使其强度每0.1秒增加一次,当为0时,强度为黑色,我想要稍微“平滑”过渡到新颜色,这样它就不会突然分散用户的注意力。

1 个答案:

答案 0 :(得分:1)

您可以使用linearpolynomial插值。两者都应该产生平稳过渡。如果您想要更渐进,逐渐减弱的效果,可以使用logarithmic interpolation

对于大多数人来说,每0.1秒可能看起来不顺畅,因为它在技术上每秒10帧。我可能会尝试每0.05-0.03秒更新一次( 20-30 FPS )。

希望有所帮助。