如何将文本文件中的文本颜色值转换为Color?

问题描述 投票:0回答:1
StreamReader w = new StreamReader(@"d:\colors.txt");
w.ReadLine();
w.Close();

文本文件行内容示例

RGBA(0.272, 0.272, 0.272, 0.500)

我想把这些值转换为ColorSo,我以后就能够做到例如。

Color c = colorFromTextFile;
c# unity3d
1个回答
2
投票

如果你的字符串看起来像给定的

RGBA(0.272, 0.272, 0.272, 0.500)

你可以用

  1. string.IndexOf 来寻找 ()
  2. string.Substring 然后提取这两个字符串之间的
  3. string.Split 最后将其切割成各个颜色组件
  4. Single.Parse 将给定的字符串解析为 float 价值观
  5. 把这些传给 Color 构造者

类似e.g.的东西。

public static bool TryParse(string input, out Color color)
{
    // e.g. input = "RGBA(0.272, 0.272, 0.272, 0.500)"

    color = default;

    try
    {
        var firstChar = input.IndexOf('(') + 1; 
        // = 5

        var lastChar = input.IndexOf(')') - 1; 
        // = 31

        var colorDataLength = lastChar - firstCharIndex; 
        // 26

        var colorData = input.SubString(firstChar, colorDataLength); 
        // = "0.272, 0.272, 0.272, 0.500"

        var colorParts = colorData.Split(','); 
        // = string[]{"0.272", " 0.272", " 0.272", " 0.500"}

        var r = float.Parse(colorParts[0].Trim());
        // = 0.272f

        var g = float.Parse(colorParts[1].Trim());
        // = 0.272f

        var b = float.Parse(colorParts[2].Trim());
        // = 0.272f

        var a = float.Parse(colorParts[3].Trim());
        // = 0.5f

        color = new Color(r, g, b, a);
        return true;
    }
    catch(Exception e)
    {
        Debug.LogError($"{e.GetType()} while trying to parse string \"{input}\"!\n{e.Message}\n{e.StackTrace}");
        return false;
    }  
}

所以你可以用e.g.这样的方式。

if(TryParse("RGBA(0.272, 0.272, 0.272, 0.500)", out var color))
{
    // success -> use color
    someMaterial.color = color;
}

或者像 将军提到 在评论中,你也可以把这个缩短一点,用上 Regex.Matches 以直接找到各个颜色组件。像

var colorParts = Regex.Matches(input, @"[0-9](\.[0-9]+)");
// = MatchCollection{"0.272", "0.272", "0.272", "0.500"}

在这种情况下,你就不需要使用 string.Trim() 因为这些已经没有空格了。

是的,你也可以使用 线路 Select 以此 float.Parse 在所有元素上一气呵成

// This is basically a shortcut for doing something like
//var colorComponentsList = new List<float>();
//foreach(var part in colorParts)
//{
//    colorComponentsList.Add(float.Parse(part.Value));
//}
//var colorComponents = colorComponentsList.ToArray();
var colorComponents = colorParts.Select(part => float.Parse(part.Value)).ToArray();
// = float[]{0.272f, 0.272f, 0.272f, 0.5f}

color = new Color(colorComponents[0], colorComponents[1], colorComponents[2], colorComponents[3]);

但是,如果你不拘泥于文件格式,你应该用HTML颜色格式(十六进制)存储你的颜色。

#45454580

并使用 ColorUtility.TryParseHtmlString


注释是在智能手机上打的,所以请耐心等待,但我希望这个想法能清楚:)

© www.soinside.com 2019 - 2024. All rights reserved.