簡體   English   中英

如何將文本顏色值從文本文件轉換為顏色?

[英]How can I convert text color values from text file to Color?

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() ,因為它們已經沒有空格。

是的,您還可以使用Linq Select來對一個float.Parse中的所有元素進行 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]);

但是,如果您不受文件格式的約束,您應該將 colors 存儲為 HTML 顏色格式(十六進制)

#45454580

並使用ColorUtility.TryParseHtmlString


筆記是在智能手機上輸入的,所以請耐心等待,但我希望這個想法很清楚:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM