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。