[РЕДАКТИРОВАНИЕ] несколько лет спустя, я возвратился для высказывания: не делают этого! См. What' s неправильно с шифрованием XOR? для деталей.
А очень простой, легкий двухсторонний encrytpion является шифрованием XOR.
mypass
. mypassmypassmypass...
) mypassmypassmypass...
). с помощью отражателя я обнаружил, как R, G, B анализируются в стандартном вызове .net (недоступно в Silverlight):
System.Drawing.ColorTranslator.FromWin32()
из этого я догадался, как получить альфа-канал как хорошо, и это делает свою работу:
Color c2 = Color.FromArgb((byte)((colorAsInt >> 0x18) & 0xff),
(byte)((colorAsInt >> 0x10) & 0xff),
(byte)((colorAsInt >> 8) & 0xff),
(byte)(colorAsInt & 0xff));
Вы могли бы использовать BitConverter.GetBytes () для преобразования вашего int в байтовый массив, который будет работать с перегрузками FromArgb, которые есть в silverlight ...
Color.FromArgb(BitConverter.GetBytes(intVal));
// or if that doesn't work
var bytes = BitConverter.GetBytes(intVal);
Color.FromArgb(bytes[3], bytes[2], bytes[1], bytes[0]);
Возможно, вы ищете класс ColorTranslator , но я не уверен, что он доступен в SilverLight или в том, что вам нужно. Это абсолютно хорошо, чтобы знать об этом.
Edit: Вот было предложение одного человека (используйте отражение, чтобы дублировать класс, так что с этого момента у вас есть доступный конвертер, с которым люди уже знакомы ).
Что не было рассмотрено, так это то, что WriteableBitmap
использует предварительно умноженный ARGB32, поэтому, если у вас полупрозрачный В пикселях значения R, G и B масштабируются от 0 до значения Alpha.
Чтобы вернуть значение цвета, вам нужно сделать обратное и снова масштабировать его от 0 до 255. Примерно как показано ниже.
r = (byte)(r * (255d / alpha))
public static Color ToColor(this uint argb)
{
return Color.FromArgb((byte)((argb & -16777216) >> 0x18),
(byte)((argb & 0xff0000) >> 0x10),
(byte)((argb & 0xff00) >> 8),
(byte)(argb & 0xff));
}
и используя:
Color c = colorAsInt.ToColor()
Думаю, должно сработать что-то вроде этого:
public byte[] GetPixelBytes(WriteableBitmap bitmap)
{
int[] pixels = bitmap.Pixels;
int length = pixels.Length * 4;
byte[] result = new byte[length]; // ARGB
Buffer.BlockCopy(pixels, 0, result, 0, length);
return result;
}
Когда у вас есть байты, получать цвета легко с помощью любого из различных API-интерфейсов Color.