在图形处理领域,经常需要将文本转换为路径轮廓,以便进行进一步的图形操作。本文将介绍一种方法,该方法能够处理不同字体和大小的文本块,并生成一个清晰的字符轮廓。这个过程包括将文本转换为路径,然后提取这些路径的轮廓。
有一组文本块,它们使用不同的字体和大小,并被手动放置在一个矩形区域内。
首先,需要将文本转换为路径。这一步是关键,因为它允许对文本进行图形操作。在某些情况下,可能会遇到错误,例如 "GenericError",这可能是由于配置问题导致的。为了解决这个问题,采用了一种自定义解决方案。
Clipper是一个开源的多边形裁剪库,适用于C#。利用这个库来实现文本路径的轮廓提取。以下是简化后的函数实现:
private GraphicsPath UnionAll(GraphicsPath gp) {
var m1 = new Matrix();
m1.Scale(100, 100);
gp.Flatten(m1, 0.01f);
var bounds = gp.GetBounds();
var c = new Clipper();
var rect = new List {
new IntPoint((int)bounds.Left - 10, (int)bounds.Top - 10),
new IntPoint((int)bounds.Right + 10, (int)bounds.Top - 10),
new IntPoint((int)bounds.Right + 10, (int)bounds.Bottom + 10),
new IntPoint((int)bounds.Left - 10, (int)bounds.Bottom + 10)
};
c.AddPolygon(rect, PolyType.ptSubject);
var iter = new GraphicsPathIterator(gp);
while (true) {
var subPath = new GraphicsPath();
bool isClosed;
if (iter.NextSubpath(subPath, out isClosed) == 0) break;
var poly = subPath.PathPoints.Select(x => new IntPoint((int)x.X, (int)x.Y)).ToList();
c.AddPolygon(poly, PolyType.ptClip);
}
var solution = new List();
var result = c.Execute(ClipType.ctDifference, solution, PolyFillType.pftPositive, PolyFillType.pftPositive);
if (!result) throw new Exception("Clipper.Execute failed");
var retval = new GraphicsPath();
foreach (var s in solution) {
retval.AddPolygon(s.outer.Select(x => new PointF(x.X, x.Y)).ToArray());
foreach (var h in s.holes) {
retval.AddPolygon(h.Select(x => new PointF(x.X, x.Y)).ToArray());
}
}
var m2 = new Matrix();
m2.Scale(0.01f, 0.01f);
retval.Transform(m2);
return retval;
}