我在 OpenNETCF 中使用 Signature 控件。它适用于我需要的大多数东西。
但是,我需要一种方法来反转签名并将其重新加载。
它有一个调用来获取签名(GetSignatureEx()
)的“字节”。它返回一个byte[]
签名。然后可以使用LoadSignatureEx()
.
我似乎无法弄清楚这些字节的系统。我以为它们可能是坐标,但现在似乎不是。
如果那里有人知道反转签名并将其重新加载的方法,我将不胜感激。
其他可能关心的人请注意:
这些字节似乎具有以下结构(按顺序):
2 个字节显示宽度 2 个字节显示高度 -- 下一部分重复到数组的末尾 2 个字节显示下一行有多少个点 -- 下一部分重复上一行指示的次数 1 个字节用于点的 x 坐标 1 个字节用于点的 y 坐标 2 个字节表示笔的宽度(我不是 100% 确定这个)
完成后,我将发布我的最终代码。
后来注意:好的,经过大量工作,我发现使用内置的东西翻转视图是多么容易(感谢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;
}
}
}