Реализация Toargb ()
-
01-10-2019 - |
Вопрос
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, byte b). Как мне разложить INT, возвращаемый TOARGB () для использования с fromargb ()?
Спасибо за любые указатели ...
Решение
Короткий и быстрый. Без дополнительного вызова метода, но с быстрыми операциями.
// 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));
Другие советы
Похоже, вы задаете два вопроса здесь, позвольте мне сделать еще один удар по нему. Независимо от того, вы захотите посмотреть на использование 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);
Надеюсь это поможет.
Просто короткое заметку:
Извлечение целочисленного представления объекта «Цвета», кажется, в 4 раза быстрее для меня при вызове Color.toArgB () непосредственно вместо использования битовых операций в отмеченном ответе. Так что, если у вас есть доступ к .TOARGB (), всегда используйте это!
Thread Creator заявил, что он не доступа к нему, так что, конечно, отмеченный ответ все еще правильный, Juse не запутается в нее заявленные «быстрые операции».
Просто имейте в виду: цвет экземпляра цвета внутренне уже сохранен как значение int, поэтому Toargb () просто возвращает его при доступе к каждому одному байту (по свойствам .a, .r., .G., .B), а затем повторно ансамбль их битовой битой вроде движется по кругу.