这两个表达式是否会产生大致相同的颜色?
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))
});
}
}
}
以下是我的系统上演示程序的样子:
答案 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
会在0
为0.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的定义会更好!另外,鉴于它们是具有不同范围的不同颜色空间,为什么要假设?
您可以查看源代码以及正在执行的操作:
特别是转换功能:
ScRgbTosRgb函数是Furqan Safdar提到的ColorFloatToByte。