将RGB字符串转换为Color类型

时间:2013-12-06 21:32:06

标签: c# colors system.drawing

我正在读取一个包含RGB值列表的文件,即

0,1,6
0,2,6
0,43,170
0,42,168
0,44,175
0,44,176
0,44,176
0,221,255
0,222,255
0,222,255

我已将所有这些值存储到string[]数组中,并使用此构造函数:

    public Program(int rows, String fileLocation) {

        int i;
        String line;
        count = 0;
        this.rows = rows;
        this.fileLocation = fileLocation;
        stringArray = new String[rows];

        try {
            System.IO.StreamReader file = new System.IO.StreamReader(fileLocation);
            for (i = 0; i < rows; i++) {
                while ((line = file.ReadLine()) != null) {
                    stringArray[i] = line;
                    count++;
                    break;
                }
            }
        }
        catch (Exception e) {
            throw (e);
        }
    }

我想将这些当前String转换为Color值,因为它们只是字符串形式的RGB值。

所以我用这个方法:

    public Color[] convertToColorArray() {
        for (int i = 0; i < rows; i++) {
            colorArray[i] = System.Drawing.Color.FromArgb(stringArray[i]);
        }
        return colorArray;
    }

据说,我收到以下错误:

enter image description here

告诉我,我有一个无效的arg。我理解这个论点不一定像255,255,255那样用逗号分隔的三个ints,但我的string输入是那种格式。我该怎么办?我应该把它投入某事吗?我应该在开头的构造函数中将这些值简单地存储到Color[]吗?

7 个答案:

答案 0 :(得分:3)

查看Color.FromArgb的重载,它们都希望传入int。所以不,你不能只传入一个字符串并期望它能够工作。但是,将字符串转换为一组整数并不难。

public Color[] convertToColorArray() {
    for (int i = 0; i < rows; i++) {
        //This gives us an array of 3 strings each representing a number in text form.
        var splitString = stringArray[i].Split(','); 

        //converts the array of 3 strings in to an array of 3 ints.
        var splitInts = splitString.Select(item => int.Parse(item)).ToArray(); 

        //takes each element of the array of 3 and passes it in to the correct slot
        colorArray[i] = System.Drawing.Color.FromArgb(splitInts[0], splitInts[1], splitInts[2]); 
    }
    return colorArray;
}

此代码假设您的源文件格式正确,以便string.Split始终返回至少3个数组,int.Parse在解析输入时永远不会失败。

答案 1 :(得分:1)

您尝试调用的函数需要1-4个参数

http://msdn.microsoft.com/en-us/library/system.drawing.color.fromargb%28v=vs.110%29.aspx

假设您确定每行中有三个值 - 这应该有效

string[] splitArray = stringArray[i].Split(',');

System.Drawing.FromARGB(Int32.Parse(splitArray[0]),Int32.Parse(splitArray[1]),Int32.Parse(splitArray[2]);

如果将Array转换为int []事先的数组

,则可以编写此清理程序
int[] intArray = splitArray.Select(sa => Int32.Parse(sa)).ToArray();

然后你可以调用intArray [0]等等。

答案 2 :(得分:1)

这样的东西?

var colors = File.ReadLines(fname)
    .Select(line => line.Split(','))
    .Select(p => Color.FromArgb(byte.Parse(p[0]), byte.Parse(p[1]), byte.Parse(p[2])))
    .ToList();

答案 3 :(得分:1)

我使用字符串的扩展方法来处理而不使用透明作为后备:

    private static System.Drawing.Color ToColor(this string color)
    {
        var arrColorFragments = color?.Split(',').Select(sFragment => { int.TryParse(sFragment, out int fragment); return fragment; }).ToArray();

        switch (arrColorFragments?.Length)
        {
            case 3:
                return System.Drawing.Color.FromArgb(arrColorFragments[0], arrColorFragments[1], arrColorFragments[2]);
            case 4:
                return System.Drawing.Color.FromArgb(arrColorFragments[0], arrColorFragments[1], arrColorFragments[2], arrColorFragments[3]);
            default:
                return System.Drawing.Color.Transparent;
        }
    }

请注意,我使用的是C#7。也许您必须调整正在使用的C#版本。

答案 4 :(得分:0)

你需要获取字符串,用逗号分隔符拆分它,然后最后为每个字符串转换成一个int,最后将它放在FromArgb方法中。

答案 5 :(得分:0)

FromArgb方法需要单个ARGB Int32值,而不是您想要的值。试试这个:

var items = stringArray[i].Split(",").Select(k => int.Parse(k)).ToArray();
colorArray[i] = Color.FromArgb(items[0], items[1], items[2]);

答案 6 :(得分:0)

FromArgb有一个重载方法,它接受3个整数作为参数,一个用于R,一个用于G,一个用于B。

将stringArray [i]拆分为3个整数部分(应该很容易,bcoz用逗号分隔)并将它们传递给方法。

希望这有帮助!