[英]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.