这个问题对我来说很难解释,所以我将用一些图像和文字来说明。
对于钢制雕刻机,我需要使用 .NET 的普通图形框架来创建发送到雕刻机的“文档”——它被视为普通打印机。有问题的机器是这个:
http://www.rolanddga.com/products/impactprinters/mpx90/features.asp
我可以使用 C# 在其上打印文本大纲:
// ALL UNITS ARE SET IN MILIMETERS (MM)
Graphics g = <instantiated from my printers-printpage-event>;
// The following values are set as "constants" here for the purpose of my question
// they normally are passed as parameters
string s = "ABC";
float fontSize = 4.0F;
RectangleF r = new RectangleF(0, 30.0F, 100.0F, 40.0F);
StringFormat sfDraw = new StringFormat();
sfDraw.Alignment = StringAlignment.Center;
FontStyle fStyle = FontStyle.Regular;
using (var gpDraw = new GraphicsPath())
{
gpDraw.AddString(text, fFamily, (int)fStyle, fSize, r, sfDraw);
SolidBrush brushFG = new SolidBrush(Color.Black);
Pen pen = new Pen(brushFG, 0.01F);
g.DrawPath(pen, gpDraw);
}
它给出了类似这样的输出:http: //i47.tinypic.com/mruu4j.jpg
我现在想要的是填写这个大纲。不仅仅是使用画笔填充(可以通过 g.FillPath(brushFG, gpDraw) 轻松完成。
相反,它应该用越来越小的轮廓“填充”,如下图所示:http: //i46.tinypic.com/b3kb29.png
(不同的线条颜色仅用于使示例更清晰)。
当我在 Photoshop 中制作示例时,我意识到我实际上想要做的是模仿功能,您可以在 Photoshop 的 Select/Modify/Contract 中找到该功能。
但我对如何实现这一点束手无策。
有什么帮助吗?我不是在寻找一个完整的解决方案,但我现在完全陷入困境。我尝试过简单的缩放,这可能是错误的方式(因为它不会产生正确的结果......)
2012-07-16 更新:我现在正在使用 Clipper 库http://www.angusj.com/delphi/clipper.php ,它有一个名为OffsetPolygons的精彩功能。
我的测试代码显示在这里: http: //pastie.org/4264890
它适用于“单个”多边形 - 例如“C”,因为它仅由单个多边形组成。“O”由两个多边形组成——一个内部和一个外部。“A”也是如此。这些给我带来了一些麻烦。看这些图片:
C: http://i46.tinypic.com/ap304.png O: http://i45.tinypic.com/35k60xg.jpg A: http://i50.tinypic.com/1zyaibm.png B: http:// /i49.tinypic.com/5lbb40.png
你得到了图片(嘿嘿...... ;-)
我认为问题是,当实际上有 2 个(在 A 和 O 的情况下)和 3 个在 B 的情况下,我从 GraphicsPath 中提取所有内容作为单个多边形。
Clipper 的 OffsetPolygons 实际上需要一个多边形数组,所以我想它能够做到这一点。但我不知道如何从 GraphicsPath 中提取我的路径作为单独的多边形。
更新 2012-07-16(当天晚些时候):
好的,我现在实际上已经成功完成了它,并将在答案中解释它,希望它可以帮助其他有类似问题的人。
非常感谢一路上帮助过的每一个人!我接受自己的答案的唯一原因是,其他人可能会通过完整的解决方案从这个问题中受益。