Точный BoundingBox на Microsoft ISF?

У меня есть набор изображений Microsoft ISF (Ink Serialized Format), которые я пытаюсь преобразовать в 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);

... однако размеры изображения кажутся необычно большими. Изменение перечисления BoundingBoxMode, переданного методу GetBoundingBox, похоже, ничего не меняет, и я получаю изображения размером 465 × 660 пикселей, которые содержат только рукописную букву "а", занимающую, возможно, 25 пикселей × 30 пикселей в реальном пространстве.

Любые предложения о том, как получить более точную ограничивающую рамку?

1 ответ

Прямоугольник ограничительной рамки находится в координатах "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);
Другие вопросы по тегам