OpenNETCF签名控制问题

我在OpenNETCF中使用Signature控件。 它适用于我需要的大多数东西。

但是,我需要一种方法来反转签名并将其加载回来。

它有一个调用来获取签名的“字节”( GetSignatureEx() )。 它返回签名的byte[] 。 然后可以使用LoadSignatureEx()重新加载此签名。

我似乎无法弄清楚这些字节的系统。 我认为它们可能是坐标,但现在看来并不是这样。

如果有人在那里知道一种方法来反转签名并加载回来,我将很高兴听到它。


其他可能关心的人请注意:

这些字节似乎具有以下结构(按顺序):

  2个字节来显示宽度  
 2个字节显示高度  
   - 下一部分重复直到数组结束  
   2个字节显示下一行中有多少个点  
     - 下一部分重复的次数与前一行所示的次数相同  
    该点的x坐标为1个字节  
    该点的y坐标为1个字节  
    笔的宽度为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 = width - 1) newHorzPoint = width - 1; original[i] = (byte)newHorzPoint; // Invert Vertical int newVertPoint = height - original[i + 1] - 1; if (newVertPoint = height - 1) newVertPoint = height - 1; original[i + 1] = (byte)newVertPoint; } } } 

完全未经测试的代码高尔夫:

 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;添加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; } } } 

我可能有点晚了,但我现在正在看代码,这里有一些值得注意的地方。

  • 前2个字节是宽度。
  • 接下来的2个字节是高度。
  • 其余数据是X,Y坐标,但存储格式具有欺骗性,可以更改。 如果维度(x或y)<256,我们使用一个字节来存储该值。 如果它更大,我们使用2个字节。 这意味着您可能会看到存储为XYXY,XXYXXY或XYYXYY的值。