Точный 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);