繁体   English   中英

将RGB字符串转换为颜色类型

[英]Casting a RGB string to a Color type

我正在读取具有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值,因为它们只是String形式的RGB值。

所以我用这种方法:

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

话虽如此,我收到以下错误:

在此处输入图片说明

告诉我我有一个无效的参数。 我知道该参数不一定是这样的255,255,255 ,它们是用逗号分隔的三个ints ,但是我的string输入是这种格式。 我该怎么办? 我应该把它丢给什么吗? 一开始我是否应该将这些值简单地存储到我的构造函数中的Color[]中?

查看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-4个参数

http://msdn.microsoft.com/zh-cn/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]等。

像这样吗

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

我使用string的扩展方法来处理透明的后备而不抛出异常:

    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#版本进行调整。

您需要获取字符串,并用逗号定界符将其分割,然后为每个字符串最后将其转换为int,最后将其放入FromArgb方法中。

FromArgb方法期望单个ARGB Int32值,而不是您想要的值。 尝试以下方法:

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

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

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

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM