2013-12-06 3 views
0

Я чтение из файла, содержащего список значений RGB, т.е.Кастинг строки RGB для типа Color

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 s в значения 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[] в моем конструкторе в начале?

+3

вам нужно разобрать строку в int и разбить ее до – wudzik

ответ

3

посмотреть на перегруженных для Color.FromArgb, все они ожидают int быть переданы в Так нет, вы не можете просто передать строку и ожидать, что она работает.. Однако нетрудно превратить вашу строку в набор 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

Весь файл хорошо структурирован, поэтому он должен работать на основе индексов от 0 до 2. – theGreenCabbage

+0

И спасибо! Это именно то, что мне нужно. – theGreenCabbage

0

вам нужно взять строку, разбить ее разделителем запятой, а затем, наконец, для каждого, преобразовать ее в int и, наконец, поместить в метод FromArgb.

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

Вы может написать этот очиститель, если вы конвертируете массив в массив int [] заранее

int[] intArray = splitArray.Select(sa => Int32.Parse(sa)).ToArray(); 

, то вы можете просто вызвать intArray [0] и так далее.

+0

Три параметра, которые я использую, - это просто 'R',' G' и 'B'. Четвертый также включает 'A', который является' alpha', но мне не нужно 'alpha' :-). – theGreenCabbage

+0

(Извините, удалена ссылка на 4-й, вам это действительно не нужно, вы можете просто вызвать перегруженный) – Haedrian

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

FromArgb имеет перегруженный метод, который принимает 3 целых числа в качестве параметров, один для R один для G и один для B.

Разделите свой stringArray [i] на 3 целых части (должно быть легко, bcoz они разделены запятыми) и передать их методу.

Надеюсь, это поможет!

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# версии, что вы используете ,

Смежные вопросы