1

これら 2 つの式は、ほぼ同じ色になりますか?

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))
                });
        }
    }
}

私のシステムでのデモ プログラムは次のようになります。

ここに画像の説明を入力

4

4 に答える 4

2

この背後にある基本的な理由は、上記のmzzzzbによって言及されています。

スケール0.0-1.0は0-255に線形にマップされません

つまり、ScRgbコンポーネントはArgbコンポーネントに線形にマッピングされません。

于 2012-11-25T19:58:58.357 に答える
1

ドキュメントから、最後の引数が実際に変更している青のコンポーネントであることがわかります。アルファは同じです。両方の色で完全に不透明

(byte) 0.25 * 255は乗算の前にキャストされるため、最初のものは効果的に純粋な黄色です0。あなたはするべきです0.25byteRGB(255, 255, 0)(byte) (0.25 * 255)RGB(255, 255, 63)

2番目の色を塗ったとき、それが実際にあることがわかりましたRGB(255, 255, 140)。そのため、スケール 0.0 - 1.0 は 0 - 255 に直線的にマッピングされないようです。

于 2012-10-27T04:25:55.823 に答える
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))
于 2012-10-27T03:45:56.140 に答える