FromArgb vs FromScRgb

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

Color.FromArgb(255, 255, 255, (byte)0.25 * 255)) Color.FromScRgb(1.0f, 1.0f, 1.0f, 0.25f)) 

该测试程序certificate它们显示出看似不同的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)) }); } } } 

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

在此处输入图像描述

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

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

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

尝试使用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)) 

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

(byte) 0.25 * 255会给你0蓝色, 0.25是在乘法前转换为byte ,所以第一个实际上是RGB(255, 255, 0) ,它是纯黄色。 你应该做(byte) (0.25 * 255)这将是RGB(255, 255, 63)

拍摄第二种颜色时我发现它实际上是RGB(255, 255, 140) 。 所以似乎比例0.0 – 1.0不会线性映射到0 – 255。