Реализация ToArgb () - PullRequest
       28

Реализация ToArgb ()

10 голосов
/ 22 апреля 2010

System.Drawing.Color имеет метод ToArgb () для возврата представления цвета Int.
В Silverlight я думаю, что мы должны использовать System.Windows.Media.Color. У него есть члены A, R, G, B, но нет метода для возврата одного значения.
Как я могу реализовать ToArgb ()? В System.Drawing.Color ToArgb () состоит из

return (int) this.Value;  

System.Windows.Media.Color имеет метод FromArgb (байт A, байт R, байт G, байт B). Как мне разложить Int, возвращаемый ToArgb () для использования с FromArgb ()?

Спасибо за любые указатели ...

Ответы [ 3 ]

32 голосов
/ 22 апреля 2010

Коротко и быстро. Без дополнительного вызова метода, но с быстрыми операциями.

// To integer
int iCol = (color.A << 24) | (color.R << 16) | (color.G << 8) | color.B;

// From integer
Color color = Color.FromArgb((byte)(iCol >> 24), 
                             (byte)(iCol >> 16), 
                             (byte)(iCol >> 8), 
                             (byte)(iCol));
5 голосов
/ 22 апреля 2010

Похоже, вы задаете здесь два вопроса, позвольте мне сделать еще один удар. В любом случае, вы захотите использовать класс BitConverter.

С этой страницы :

Порядок следования байтов 32-битного ARGB значение равно AARRGGBB.

Итак, чтобы реализовать ToArgb(), вы могли бы написать метод расширения , который делает что-то вроде этого:

public static int ToArgb(this System.Windows.Media.Color color)
{
   byte[] bytes = new byte[] { color.A, color.R, color.G, color.B };
   return BitConverter.ToInt32(bytes, 0);
}

И для «декомпозиции Int, возвращаемого ToArgb () для использования с FromArgb ()», вы можете сделать это:

byte[] bytes = BitConverter.GetBytes(myColor.ToArgb());
byte aVal = bytes[0];
byte rVal = bytes[1];
byte gVal = bytes[2];
byte bVal = bytes[3];  

Color myNewColor = Color.FromArgb(aVal, rVal, gVal, bVal);

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

1 голос
/ 04 апреля 2013

Просто короткая заметка:

Получение целочисленного представления объекта "Color" кажется мне в 4 раза быстрее при непосредственном вызове color.ToArgb () вместо использования операций битового сдвига в отмеченном ответе. Поэтому, если у вас есть доступ к .ToArgb (), всегда используйте это!

Создатель потока заявил, что не имеет к нему доступа, поэтому, конечно, помеченный ответ по-прежнему правильный, juse не смущает заявленные в нем "быстрые операции".

Просто имейте в виду: цвет экземпляра Color внутренне уже сохранен как значение int, поэтому ToArgb () просто возвращает его, получая доступ к каждому его отдельному байту (через свойства .A, .R.,. G., .B), а затем повторно объединить их с помощью сдвига битов, это своего рода движение по кругу.

...