Полностью непроверенный код Гольф:
public void InvertSignature(ref byte[] original,
bool invertHorizontal, bool invertVertical)
{
for (int i = 0; i < original.Length; i += 2)
{
if ((original[i] != 0) && (original[i + 1] != 0))
{
if (invertHorizontal)
{
original[i] = 232 - original[i] - 1;
}
if (invertVertical)
{
original[i + 1] = 64 - original[i + 1] - 1;
}
}
}
}
Или попробуйте эту версию, исходя из предположения, что первые 4 байта используются для хранения ширины и высоты подписи (2 байта коротких целых для каждого):
public void InvertSignature(ref byte[] original,
bool invertHorizontal, bool invertVertical)
{
byte w = (byte)BitConverter.ToInt16(original, 0) - 1;
byte h = (byte)BitConverter.ToInt16(original, 2) - 1;
// TO DO: blow up if w or h are > 255
for (int i = 4; i < original.Length; i += 2)
{
if ((original[i] != 0) && (original[i + 1] != 0))
{
if (invertHorizontal)
{
original[i] = w - original[i];
}
if (invertVertical)
{
original[i + 1] = h - original[i + 1];
}
}
}
}
См .: Преобразование OpenNetCF GetSignatureEx в растровое изображение на рабочем столе
Обновление: Учитывая ваше описание того, почему вам нужно инвертировать подпись, вам может быть проще просто инвертировать ScreenOrientation вашего устройства на 180 градусов (а затем обратно после того, как клиент подпишет). Таким образом, у вас также могут быть ярлыки, которые сообщают клиенту о том, что они подписывают, иначе они будут смотреть на кучу перевернутых вещей (кроме самого элемента управления подписью).
Для этого добавьте ссылку на Microsoft.WindowsCE.Forms
в ваш проект, затем добавьте using Microsoft.WindowsCE.Forms;
в начало вашего файла.
Чтобы перевернуть экран на 180 градусов:
SystemSettings.ScreenOrientation = ScreenOrientation.Angle180;
Чтобы вернуться к обычному режиму:
SystemSettings.ScreenOrientation = ScreenOrientation.Angle0;
Если вы запускаете это в эмуляторе, ваш экран будет по-прежнему нормально выглядеть, но кожа переворачивается вверх ногами.
Обновление: последний выстрел, основанный на ответе ctacke
(это должно работать для подписей с любыми измерениями):
public void InvertSignature(ref byte[] original,
bool invertHorizontal, bool invertVertical)
{
short w = BitConverter.ToInt16(original, 0);
short h = BitConverter.ToInt16(original, 2);
int i = 4;
while (i < original.Length)
{
if (invertHorizontal)
{
if (w < 256)
{
if (original[i] != 0)
{
original[i] = (byte)w - original[i] - 1;
}
i++;
}
else
{
short val = BitConverter.ToInt16(original, i);
if (val != 0)
{
val = w - val - 1;
byte[] valbytes = BitConverter.GetBytes(val);
Buffer.BlockCopy(valbytes, 0, original, i, 2);
}
i += 2;
}
}
else
{
i += (w < 256) ? 1 : 2;
}
if (invertVertical)
{
if (h < 256)
{
if (original[i] != 0)
{
original[i] = (byte)h - original[i] - 1;
}
i++;
}
else
{
short val = BitConverter.ToInt16(original, i);
if (val != 0)
{
val = h - val - 1;
byte[] valbytes = BitConverter.GetBytes(val);
Buffer.BlockCopy(valbytes, 0, original, i, 2);
}
i += 2;
}
}
else
{
i += (h < 256) ? 1 : 2;
}
}
}