如何获得平滑的颜色变化

本文关键字:颜色 变化 平滑 何获得 | 更新日期: 2023-09-27 18:25:00

在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);
            }
        }
    }

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

感谢这个人和另一个

    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时,强度为黑色时,我希望过渡到新颜色,这样就不会突然分散用户的注意力。

如何获得平滑的颜色变化

您可以使用线性或多项式插值。两者都应该产生一个平稳的过渡。如果你想要一个更渐进的、逐渐变细的效果,你可以使用对数插值。

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

希望能有所帮助。