FromArgb vs FromScRgb

时间:2012-10-27 03:18:12

标签: c# wpf

这两个表达式是否会产生大致相同的颜色?

Color.FromArgb(255, 255, 255, (byte)0.25 * 255))

Color.FromScRgb(1.0f, 1.0f, 1.0f, 0.25f))

此测试程序证明它们显示出看似不同的alpha值:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;

namespace Test_FromArgb_FromScRbg
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            var panel = new StackPanel();

            Content = panel;

            panel.Children.Add(
                new Rectangle()
                {
                    Width = 100,
                    Height = 100,
                    Fill = new SolidColorBrush(
                        Color.FromArgb(
                            255, 
                            255, 
                            255, 
                            (byte)0.25 * 255))
                });

            panel.Children.Add(
                new Rectangle()
                {
                    Width = 100,
                    Height = 100,
                    Fill = new SolidColorBrush(
                        Color.FromScRgb(
                            1.0f,
                            1.0f,
                            1.0f,
                            0.25f))
                });
        }
    }
}

以下是我的系统上演示程序的样子:

enter image description here

4 个答案:

答案 0 :(得分:1)

上面的mzzzzb提到了背后的基本原因:

  

标度0.0 - 1.0不会线性映射到0 - 255

即。 ScRgb组件不会线性映射到Argb组件。

答案 1 :(得分:0)

尝试使用ColorFloatToByte方法获得所需的结果:

private static byte ColorFloatToByte(float val)
{
    if (!(val > 0.0)) // Handles NaN case too
        return (0);
    else if (val <= 0.0031308)
        return ((byte)((255.0f * val * 12.92f) + 0.5f));
    else if (val < 1.0)
        return ((byte)((255.0f * ((1.055f * 
               (float)Math.Pow((double)val, (1.0 / 2.4))) - 0.055f)) + 0.5f));
    else
        return (255);
}

用法:

Color.FromArgb(255, 255, 255, ColorFloatToByte(0.25f)))

Color.FromScRgb(1.0f, 1.0f, 1.0f, 0.25f))

答案 2 :(得分:0)

从文档我可以看到最后一个参数实际上是你正在修改的蓝色组件,alpha是相同的;两种颜色完全不透明

(byte) 0.25 * 255会在00.25时将byte蓝色投射到RGB(255, 255, 0),因此第一个实际上是(byte) (0.25 * 255)纯黄色。你应该做RGB(255, 255, 63) RGB(255, 255, 140)

当拍摄第二种颜色时,我发现它实际上是{{1}}。所以似乎比例0.0 - 1.0不会线性映射到0 - 255。

答案 3 :(得分:0)

与已经提到的答案相同-它们不是线性映射的(它们是不同的色彩空间-ScRGB不是精度更高的SRGB)

对mzzzzb“ @FurqanSafdar,您提供的解决方案可能是正确的。但这并不是重点,直觉上,我们认为它们是线性相关的。请问您如何获得该解决方案的呢?”

(我们都知道假设会发生什么。)也许链接到sRGB和ScRGB的定义会更好!另外,鉴于它们是具有不同范围的不同颜色空间,为什么要假设?

您可以查看源代码以及正在执行的操作:

FromScRGB

FromArgb

特别是转换功能:

ScRgbTosRgb

sRgbToScRgb

ScRgbTosRgb函数是Furqan Safdar提到的ColorFloatToByte。