OpenNETCF Подпись контрольный вопрос
Я использую элемент управления Signature в 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;
}
}
}