Преобразование интервала для раскрашивания C# для WriteableBitmap Silverlight

[РЕДАКТИРОВАНИЕ] несколько лет спустя, я возвратился для высказывания: не делают этого! См. What' s неправильно с шифрованием XOR? для деталей.

А очень простой, легкий двухсторонний encrytpion является шифрованием XOR.

  1. Придумывает пароль. Давайте иметь его быть mypass.
  2. Преобразовывают пароль в двоичный файл (согласно ASCII). Пароль становится 01101101 01111001 01110000 01100001 01110011 01110011.
  3. Берут сообщение, которое Вы хотите закодировать. Преобразуйте это в двоичный файл, также.
  4. Взгляд на длину сообщения. Если длина сообщения составляет 400 байтов, превратите пароль в 400 строк байтов путем повторения его много раз. Это стало бы 01101101 01111001 01110000 01100001 01110011 01110011 01101101 01111001 01110000 01100001 01110011 01110011 01101101 01111001 01110000 01100001 01110011 01110011... (или mypassmypassmypass...)
  5. XOR сообщение с длинным паролем.
  6. Отправляют результат.
  7. Другое время, XOR зашифрованное сообщение с тем же паролем (mypassmypassmypass...).
  8. Там является Вашим сообщением!

10
задан 15 July 2009 в 20:34
поделиться

7 ответов

с помощью отражателя я обнаружил, как 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));
7
ответ дан 4 December 2019 в 00:26
поделиться

Вы могли бы использовать 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]); 
4
ответ дан 4 December 2019 в 00:26
поделиться
Color.FromArgb(intVal)
-1
ответ дан 4 December 2019 в 00:26
поделиться

Возможно, вы ищете класс ColorTranslator , но я не уверен, что он доступен в SilverLight или в том, что вам нужно. Это абсолютно хорошо, чтобы знать об этом.

Edit: Вот было предложение одного человека (используйте отражение, чтобы дублировать класс, так что с этого момента у вас есть доступный конвертер, с которым люди уже знакомы ).

0
ответ дан 4 December 2019 в 00:26
поделиться

Что не было рассмотрено, так это то, что WriteableBitmap использует предварительно умноженный ARGB32, поэтому, если у вас полупрозрачный В пикселях значения R, G и B масштабируются от 0 до значения Alpha.

Чтобы вернуть значение цвета, вам нужно сделать обратное и снова масштабировать его от 0 до 255. Примерно как показано ниже.

r = (byte)(r * (255d / alpha))
2
ответ дан 4 December 2019 в 00:26
поделиться
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()
0
ответ дан 4 December 2019 в 00:26
поделиться

Думаю, должно сработать что-то вроде этого:

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.

0
ответ дан 4 December 2019 в 00:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: