2012-10-27 61 views
1

這兩個表達式應該導致顏色大致相同嗎?FromArgb vs FromScRgb

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

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

這個測試程序表明,他們表現出了看似不同的α值:

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

回答

1

這背後的基本原因是由mzzzzb上面提到:

規模0.0 - 1.0不線性地映射到0 - 255

iee ScRgb組件不會線性映射到Argb組件。

+0

什麼是像那樣的映射 - 某種伽馬曲線? –

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)) 
0

從文檔,我可以看到的是,最後一個參數實際上是要修改的藍色成分,阿爾法是相同的;完全不透明的兩種顏色

(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

+0

啊哈......他們沒有線性映射確實是這裏的問題。謝謝mzzzzb! – dharmatech

+0

即使使用63((字節)(0.25 * 255))也不符合相同的顏色。 –

+0

yup,浮點標度不會線性映射到int 0-255標度。 @FurqanSafdar您提供的解決方案可能是正確的。但那不是重點,事情就是這樣 - 直觀上我們假設它們是線性相關的。 btw你是如何得到該解決方案的 – mzzzzb

相關問題