如何将文本颜色值从文本文件转换为颜色?


StreamReader w = new StreamReader(@"d:colors.txt");
w.ReadLine();
w.Close();

文本文件行内容示例

RGBA(0.272, 0.272, 0.272, 0.500(

我想将值转换为颜色 所以我稍后可以这样做,例如:

Color c = colorFromTextFile;

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

RGBA(0.272, 0.272, 0.272, 0.500)

你可以使用

  1. string.IndexOf找到()
  2. string.Substring然后提取这两者之间的字符串
  3. string.Split最终将其切割成单独的颜色成分
  4. Single.Parse将给定字符串解析为float
  5. 将这些传递给Color构造函数

例如

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

所以你可以像这样使用它

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

或者,正如TheGeneral在评论中提到的,您也可以将其缩短一点,并使用Regex.Matches直接查找各个颜色组件。喜欢

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

在这种情况下,您不需要使用string.Trim()因为它们已经没有空格。

是的,您还可以使用 LinqSelect一次性对所有元素进行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


在智能手机上输入的笔记,所以请耐心等待,但我希望这个想法:)清楚

最新更新