问题标签 [graphicspath]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
6186 浏览

c# - .Net 对面的 GraphicsPath.Widen()

我需要与GraphicsPath.Widen().Net中的方法相反:

Widen()方法不接受负参数,所以我需要一个Inset方法的等价物:

您可以在开源 Inkscape 应用程序 (www.Inkscape.org) 中执行此操作,方法是转到菜单并选择“Path / Inset”(Inset 数量存储在 Inkscape 属性对话框中)。由于 Inkscape 是开源的,应该可以在 C#.Net 中执行此操作,但我无法终生遵循 Inkscape C++ 源代码(我只需要这个功能,所以我不能证明学习 C++来完成这个)。

基本上,我需要一个带有此签名的 GraphicsPath 扩展方法:

正如签名所述,它将采用一个GraphicsPath对象和.Inset()路径通过的数量......就像今天的 Inkscape 一样。如果它简化了任何事情,那么有问题的 GraphicsPaths 都是从该.PolyBezier方法创建的(仅此而已),因此无需考虑矩形、椭圆或任何其他形状,除非您为了完整性而这样做。

不幸的是,我没有使用 C++ 代码的经验,所以我几乎不可能遵循 Inkscape 中包含的 C++ 逻辑。

.

[编辑:] 根据要求,这里是“MakeOffset”Inkscape 代码。第二个参数(double dec)对于 Inset 为负数,该参数的绝对值是引入形状的量。

我知道这里有很多依赖项。如果您需要查看更多 Inkscape 源文件,请访问:http: //sourceforge.net/projects/inkscape/files/inkscape/0.48/

.

[编辑]

@Simon Mourier - 了不起的工作。代码甚至干净易读!干得好,先生。不过,我确实有几个问题要问你。

首先,金额的正数代表什么?我在想,对于 Offset 方法,正数将是“开始”,负数将是“插入”,但您的示例似乎相反。

其次,我做了一些基本测试(只是扩展了你的样本),发现了一些奇怪的地方。

以下是当偏移量增加时,cool 中的“l”会发生什么(对于这样一个简单的字母,它肯定会引起问题!)。

西蒙测试 2

...以及重现该代码的代码:

最后,有点不同。这是 Wingdings 中的“S”字符(看起来像一滴眼泪):

泪滴

这是代码:

天啊,离得这么近,看得我想哭。但是,它仍然不起作用。

我认为解决这个问题的方法是查看插入向量何时相交,并停止插入超过该点。如果插入量太大(或路径太小)以至于什么都没有,则路径应该消失(变为空),而不是自身反转并重新扩展。

同样,我不会以任何方式敲击您所做的事情,但我想知道您是否知道这些示例可能会发生什么。

(PS - 我添加了 'this' 关键字以使其成为扩展方法,因此您可能需要使用方法(参数)表示法调用代码才能运行这些示例)

.

@RAN Ran 通过重新使用 GraphicsPath 本机方法得出了类似的输出。伙计,这很难。他们俩都那么亲近。

这是两个示例的屏幕截图,使用了 Wingdings 中的字符“S”:

泪滴对比

@Simon 在左边,@Ran 在右边。

这是在 Inkscape 中进行“Inset”之后的相同泪滴“S”字符。插图很干净:

撕裂 Inkscape

顺便说一下,这是@Ran 的测试代码:

0 投票
2 回答
1126 浏览

c# - 沿圆形 GraphicsPath 的 GDIPlus 渐变

我在图形路径中有一个“甜甜圈”。

我想沿着该路径绘制一个渐变,并控制颜色何时以圆上给定的开始和结束角度开始和结束。

像这样:

http://www.andresilvadesign.com/wp-content/uploads/2011/01/Gauge-icon-design.jpg

LinearGradient 只能走一个角度,并且不能正确地跟随路径。

PathGradientBrush 似乎只是.. 一个圆形渐变?我似乎找不到在 C# 中正确执行此操作的方法。

任何帮助将非常感激!

0 投票
4 回答
10024 浏览

c# - 将 SVG 路径数据转换为 GDI+ GraphicsPath 数据

有没有一种简单的方法可以将 SVG 路径标记转换为 C# System.Drawing.Drawing2D.GraphicsPath?它们都密切相关,我希望可以轻松地将 SVG 路径数据转换为 GraphicsPath 点。

0 投票
1 回答
3206 浏览

c# - 在新对象上实现矩阵变换

我需要能够转换我自己的对象之一以及 .Net 中的一些 GraphicsPath 对象。我需要在 GraphicsPath 对象上执行的任何缩放、平移、旋转操作也发生在我自己的对象上。

例如,这是一些缩放代码:

问题是:在 MyObject 中实现“Transform”方法的最佳方法是什么?我做了相当多的搜索,但找不到任何参考资料来说明最好的方法。

谢谢!

0 投票
1 回答
880 浏览

.net - 如何管理 GraphicsPath.AddString 中的字符间距?

在 GraphicsPath 中添加字符串时,我需要更改字符之间的距离。做这个的最好方式是什么?

0 投票
1 回答
1251 浏览

c# - DrawPath(Pen,GraphisPath) 正在抛出 OutOfMemoryException

我已经经历了几次,无法弄清楚。DrawPath 方法抛出 System.OutOfMemoryException。

我已经看到 pen.DashPattern 实际上也抛出了 System.OutOfMemoryException,所以我设置了破折号模式,但更正它并不能防止错误。

在这里的任何帮助都会很可爱!提前致谢!

0 投票
1 回答
1461 浏览

c# - 从位图的非透明区域创建 Region 或 GraphicsPath

我想对绘制的位图进行命中测试,以查看给定点是否在图像的非透明像素中可见。

例如,要对整个位图矩形进行此测试,您可以执行以下操作:

但是,如果我有一个非矩形项目的位图,并且我希望能够检查他们是否单击了非透明区域,那么 .NET 框架中是否有任何支持的方式来执行此操作?

我能想到的唯一方法是将位图字节锁定到一个数组中,并遍历它,将每个不透明的 x,y 坐标添加到 Point 结构数组中。然后使用这些点结构组装一个 GraphicsPath。

由于这些点将从零开始,因此我需要用绘制图像的 x,y 坐标与 0,0 之间的距离来偏移鼠标位置。但是这样,如果我多次绘制它,我基本上可以为每个图像使用相同的 GraphicsPath,只要图像没有倾斜或缩放不同。

如果这是唯一的好路线,我将如何将点添加到 GraphicsPath?从点到点画线?画一条闭合曲线?

0 投票
2 回答
2557 浏览

c# - .Net Graphicspath 的包络失真

我正在尝试找出将 .net 中的 GraphicsPath 变形为特定形状的最佳方法。我想要达到的结果是扭曲文本以向上、向下、向左、向右扇形以及像波浪一样的东西。所有这些都可以在 Adob​​e Illustrator 中使用包络扭曲功能来实现。

我考虑过使用一些预定义的网格和点映射系统来转换点来使用我自己的方法。但是,似乎有一些关于如何做到这一点的算法或样本已经可用?

0 投票
3 回答
4271 浏览

c# - 从半透明位图创建 GraphicsPath

我想创建一个 GraphicsPath 和一个点列表来形成位图非透明区域的轮廓。如果需要,我可以保证每张图像只有一个不透明像素的实体集合。因此,例如,我应该能够沿像素边缘顺时针或逆时针记录点并执行完整的闭环。

这个算法的速度并不重要。但是,如果我可以跳过一些点以减少更小且不太复杂的 GraphicsPath,那么结果点的效率是半重要的。

我将在下面列出我当前的代码,它可以完美地与大多数图像配合使用。然而,一些更复杂的图像最终会出现似乎以错误顺序连接的路径。我想我知道为什么会发生这种情况,但我无法提出解决方案。

当我将点变成路径时:

这是一个显示我想要的示例。红色轮廓应该是一个点数组,可以将其制成 GraphicsPath 以执行命中检测、绘制轮廓笔并用画笔填充它。

大纲示例

0 投票
1 回答
719 浏览

.net - 在图像的不透明部分内绘制边框

这个线程几乎是我需要的: Creating a GraphicsPath from a semi-transparent bitmap

但他正在图像周围绘制轮廓 - 我需要在图像内部绘制一个仅几个像素的轮廓。基本上我正在尝试绘制一个“焦点矩形”(除非它不是矩形),结果需要采用 GraphicsPath 的形式,以便我可以将它直接放入我当前的代码中。

私有函数 GetImagePath(img as Image) as GraphicsPath ...结束函数

[编辑] 好的,首先我什至无法从其他帖子中获取代码来工作。我一直在这一行得到索引超出范围:

*byte alpha = originalBytes[y * bitmapData.Stride + 4 * x + 3];*

那就是如果它甚至先通过其他东西。很多时候它从第一个循环中出来并没有找到一个不透明的点——当大部分图像是不透明的时候。

最新的问题是它创建了一个没有任何意义的点列表。图像是 68x68 我的点列表有像 290x21 这样的点,甚至像 2316x-15 这样更疯狂的点

这是我的原始图像:

[不会让我上传因为我是新人]

它是 70x70 的按钮的背景图像 - 如果这很重要的话。