【问题标题】:Casting a RGB string to a Color type将 RGB 字符串转换为 Color 类型
【发布时间】:2013-12-24 09:31:27
【问题描述】:

我正在读取具有 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);
        }
    }

我想将这些当前的 Strings 转换为 Color 值,因为它们只是字符串形式的 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[] 中吗?

【问题讨论】:

  • 你需要把你的字符串解析成int,然后再拆分

标签: c# colors system.drawing


【解决方案1】:

看看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 在解析输入时永远不会失败。

【讨论】:

  • 整个文件的结构很好,所以它应该基于 0 到 2 个索引工作。
【解决方案2】:

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

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

【讨论】:

  • 我发现FromArgb1 有重载,因此您不需要单独调用 RGB 和 ARGB。您的代码可以简化为简单的if/else,有两种选择:颜色和透明。
  • 您认为我应该使用哪个重载?我找不到你提到的方法FromArgb1(后缀为1)。
  • 1 是一个错字。您使用哪种重载取决于您是否具有 alpha 值。
【解决方案3】:

您尝试调用的函数需要 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] 等等。

【讨论】:

  • 我使用的三个参数就是RGB。第四个还包括A,即alpha,但我不需要alpha :-)。
  • (抱歉,删除了对第 4 个的引用。您实际上并不“需要它”,您可以调用重载的那个)
【解决方案4】:

这样的?

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

【讨论】:

    【解决方案5】:

    你需要获取字符串,用逗号分隔符分割,最后对每个字符串,将其转换为 int,最后放入 FromArgb 方法中。

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

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

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

        希望这会有所帮助!

        【讨论】:

          猜你喜欢
          • 2010-09-26
          • 1970-01-01
          • 1970-01-01
          • 2011-07-26
          • 2020-11-13
          • 2020-05-21
          • 1970-01-01
          • 2010-09-20
          • 1970-01-01
          相关资源
          最近更新 更多