Microsoft ISF上准确的BoundingBox?

时间:2009-09-08 22:38:50

标签: c# graphics handwriting microsoft.ink

我有一组Microsoft ISF(墨迹序列化格式)图像,我试图将其转换为PNG以包含在网页中。我已成功使用C#包Microsoft.Ink将墨迹绘制到位图并保存为PNG:

byte[] data; // data has the raw bytes of the ISF file
Ink ink = new Ink();
Renderer renderer = new Renderer();
Stream outStream; // a Stream to hold the PNG data
ink.Load(data);
using (Strokes strokes = ink.Strokes) {
  // get bounds of ISF
  rect = strokes.GetBoundingBox(BoundingBoxMode.PointsOnly);
  // create bitmap matching bounds
  bm = new Bitmap(rect.Width, rect.Height);
  // draw the ISF onto the Bitmap
  using (Graphics g = Graphics.FromImage(bm)) {
    g.Clear(Color.Transparent);
    renderer.Draw(g, strokes);
  }
}
// save the Bitmap to PNG format
bm.Save(outStream, System.Drawing.Imaging.ImageFormat.Png);

...但是,图像尺寸似乎异常大。更改传入GetBoundingBox方法的BoundingBoxMode枚举似乎没有任何改变,我得到的图像为465px×660px,并且只包含一个手写字母'a',在实际空间中可能占用25px×30px。

有关如何获得更准确的边界框的任何建议吗?

1 个答案:

答案 0 :(得分:0)

边界框矩形位于“Inkspace”坐标中 - 创建一次性位图和图形对象,然后使用renderer.InkSpacetoPixel转换矩形。

在GetBoundingBox调用和Bitmap bm的创建之间添加这些行,并且Bitmap的大小应该正确:

Bitmap bmTrash = new Bitmap(10, 10);
Graphics gTrash = Graphics.FromImage(bmTrash);
renderer.InkSpaceToPixel(gTrash, rect.Location);
renderer.InkSpaceToPixel(gTrash, rect.Size);