我正在读取一个包含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;
}
据说,我收到以下错误:
告诉我,我有一个无效的arg。我理解这个论点不一定像
255,255,255
那样用逗号分隔的三个ints
,但我的string
输入是那种格式。我该怎么办?我应该把它投入某事吗?我应该在开头的构造函数中将这些值简单地存储到Color[]
吗?
答案 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用逗号分隔)并将它们传递给方法。
希望这有帮助!