我有一组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。
有关如何获得更准确的边界框的任何建议吗?
答案 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);