2014-01-28 2 views
0

У меня есть значение: RGBA (1.000, 0.000, 0.000, 0,090)Работа с RGBA с десятичными значениями

Мне нужно нарисовать это в ячейки сетки.

У меня есть следующий код до сих пор:

var matches = Regex.Matches(e.CellValue.ToString(), @"([0-9]+\.[0-9]+)"); 

if (matches.Count == 4) 
{ 
    Color.FromArgb(matches[4].Value, matches[0].Value, matches[1].Value, matches[2].Value); 
} 

Дело в том, Color.FromArgb имеет дело только с Int32. И, насколько я видел, все функции под Color. - это дело Int32. Как мне управлять преференциями здесь?

Спасибо.

ответ

2

Что вы делаете это: разбирают части с помощью регулярных выражений вы предоставили, использовать детали для расчета соответствующих целочисленное значение, основанное на диапазоне 0-255 и объединяющее части для формирования цвета.

var regex = new Regex(@"([0-9]+\.[0-9]+)"); 
string colorData = "RGBA(1.000, 0.000, 0.000, 0.090)"; 

var matches = regex.Matches(colorData); 
int r = GetColorValue(matches[0].Value); 
int g = GetColorValue(matches[1].Value); 
int b = GetColorValue(matches[2].Value); 
int a = GetColorValue(matches[3].Value); 

var color = Color.FromArgb(a,r,g,b); 


private static int GetColorValue(string match) 
{ 
    return (int)Math.Round(double.Parse(match, CultureInfo.InvariantCulture) * 255); 
} 
+0

А что может быть обратным процессом? I.e, Из System.Drawing.Color для четырех целых чисел? У меня это так много на данный момент: var c = BitConverter.GetBytes (GetColor(). ToArgb()); Alpha = c [0]; Красный = c [1]; Зеленый = c [2]; Blue = c [3]; } ' – DoomerDGR8

+1

или цвет.R, цвет.G, цвет.B и т. Д., Есть свойства, чтобы сделать эту работу. – Bas

+0

Да, это тип Bytes. Я хочу масштабировать исходный Int32 с точностью RGBA (1.000, 0.000, 0.000, 0.090) – DoomerDGR8

1

Color.FromArgb использует различное значение шкалы, где значения находятся в диапазоне betweeen 0 и 255. я гавань испытания, но она должна быть somethign вдоль этих линий:

public Color FromArgbFloat(float alpha, float r, float g, float b) 
    { 
     return Color.FromArgb((int)Math.Round(alpha*255), (int)Math.Round(r*255), (int)Math.Round(g*255), Math.Round(b*255); 
    } 
+0

Такая же ошибка: Невозможно неявно преобразовать тип 'double' в 'int'. Явное преобразование существует (вы пропускаете листинг?) – DoomerDGR8

+0

Вы уверены, что в сообщении об ошибке говорится: «Невозможно неявно преобразовать тип« double »в« int ». Это странно, потому что мой фрагмент кода вообще не использует double. –

1

Color.FromArgb работает с int от 0 255, вы можете изменить свой код на:

Color.FromArgb(Transform(matches[3].Value), Transform(matches[0].Value), Transform(matches[1].Value), Transform(matches[2].Value)); 

// ... 

private int Transform(double value) 
{ 
    return (int)Math.Round(value*255); 
} 
+0

Хорошо, но я получаю сообщение об ошибке: Невозможно неявно преобразовать тип 'double' в 'int'. Явное преобразование существует (вы пропускаете листинг?) – DoomerDGR8

+0

Кроме того, индексы неверны: совпадения [4] не будут работать – Bas

+0

Да, отсутствовал листинг, а индекс 4 должен быть 3. Я исправил это. – MatthiasG

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