Я использую элемент управления «Подпись» в OpenNETCF. Он отлично работает почти со всем, что мне нужно.
Однако мне нужен способ инвертировать подпись и загрузить ее обратно.
У него есть вызов для получения «байтов» для подписи (GetSignatureEx()
). Он возвращает byte[]
подписи. Затем эту подпись можно загрузить обратно с помощью LoadSignatureEx()
.
Я не могу понять систему для этих байтов. Я подумал, что это могут быть координаты, но сейчас это не так.
Если кто-нибудь знает способ инвертировать подпись и загрузить ее обратно, я был бы благодарен за это.
Примечание для других, кому может быть небезразлично:
Эти байты имеют следующую структуру (по порядку):
2 bytes to show Width 2 bytes to show Height -- This next part repeats till the end of the array 2 bytes to show How many points are in the next line -- This next part repeats as many times as the previous line indicated 1 byte for the x coordinate of the point 1 byte for the y coordinate of the point 2 bytes for the width of the pen (I am not 100% sure on this one)
Я отправлю свой последний код, как только он будет готов.
Позднее примечание: Хорошо, после тонны работы я обнаружил, насколько легко перевернуть представление, используя встроенные средства (спасибо MusiGenesis). Мне кажется, что это менее подверженный ошибкам процесс.
На случай, если это кому-то понадобится, вот мой незавершенный код. (Я был близок к этому, но переход к следующей «строке» работает не совсем правильно.) (РЕДАКТИРОВАТЬ: я решил, что мне немного больше нравится, как это работает. Я обновил код ниже. Это будет работать, пока ширина или высота элемента управления Signature не превышает 256 (см. ответ ctacke ниже).
Но сначала большое спасибо MusiGenesis, которая помогла мне во всем разобраться. Вы очень любезны, и я очень ценю ваши усилия!
Теперь код:
private void InvertSignature(ref byte[] original)
{
int currentIndex = 0;
short width = BitConverter.ToInt16(original, 0);
short height = BitConverter.ToInt16(original, 2);
while (currentIndex < original.Length - 4)
{
// Move past the last iteration (or the width and hight for the first time through).
currentIndex += 4;
// Find the length of the next segment.
short nextGroup = BitConverter.ToInt16(original, currentIndex);
//Advance one so we get past the 2 byte group
currentIndex += 2;
// Find the actual index of the last set of coordinates for this segment.
int nextNumberOfItems = ((nextGroup) * 4) + currentIndex;
// Invert the coordinates
for (int i = currentIndex; i < (nextNumberOfItems - 1); i += 4)
{
currentIndex = i;
//Invert Horizontal
int newHorzPoint = width - original[i] - 1;
if (newHorzPoint <= 0)
newHorzPoint = 0;
else if (newHorzPoint >= width - 1)
newHorzPoint = width - 1;
original[i] = (byte)newHorzPoint;
// Invert Vertical
int newVertPoint = height - original[i + 1] - 1;
if (newVertPoint <= 0)
newVertPoint = 0;
else if (newVertPoint >= height - 1)
newVertPoint = height - 1;
original[i + 1] = (byte)newVertPoint;
}
}
}