【问题标题】:Reading SVG path in Java在 Java 中读取 SVG 路径
【发布时间】:2019-12-13 19:54:36
【问题描述】:

我正在读取 java 中的文本文件,我使用扫描仪类读取 SVG 格式的文本。我看过推荐蜡染的答案。我想知道如何仅在 SVG 格式的路径数据上使用 Batik。我想评估路径并提取可以追踪路径的点。我可以使用 Batik 来执行此操作,而无需在 Batik 中评估整个文件吗?

我试图创建自己的路径解析器,但我没有足够的时间或技能去做。我正在评估 SVG 格式的标签,方法是使用 < and /> 拆分它们,我坚持评估路径的 d 属性。这是我需要评估的路径示例:

<html>
<body>

<svg width="10000" height="1000">
<path id="square" fill="#0000FF" 
d="M351.3,251 l-3.1-2.2c-0.3-0.2-0.3-0.5-0.1-0.8l2.2-3.1c0.2-0.3,0.5-0.3,0.8-0.1l3.1,2.2
c0.3,0.2,0.3,0.5,0.1,0.8l-2.2,3.1C355,251.1,354.6,251.2,354.3,251z"/>

</body>
</html>

我需要这条路径上的点。

【问题讨论】:

  • 你能改变反对意见吗?似乎一个人理解了我想问的问题,并乐于助人地回答。我现在将继续使用 JavaScript 将所有路径转换为多边形,然后只使用那里的点。

标签: java parsing svg batik


【解决方案1】:

使用 Batik 解析路径看起来相当简单:

看起来您只需要创建一个实现PathHandler 接口的类。

class MyPathHandler implements PathHandler
{
  void  startPath() { ... }
  void  movetoAbs(float x, float y)
  ... etc...
  void  endPath() { ... }
}

然后做:

  PathParser parser = new PathParser();
  parser.setPathHandler(new MyPathHandler());
  parser.parse("M351.3,251 l-3.1-2.2 ... snip ... C355,251.1,354.6,251.2,354.3,251z");
  parser.doParse();

每当 PathParser 遇到M 命令等时,都会调用moveToAbs() 方法。

如果这不起作用,那么我可以在大约一分钟的谷歌搜索中找到至少四到五个 Java 或 JS 中的 SVG 路径解析代码实例。

至于采样部分。这要棘手得多。您需要代码来测量二次和三次贝塞尔曲线以及弧的长度。后者可能涉及将弧(A/a)转换为中心参数化(规范中有关于如何做到这一点的信息)。做这一切并非易事。如果你能在 Batik、Firefox、Chrome、Android 等中找到它,就会有代码。也许还有一些人已经构建了代码。

如果您在浏览器中执行此操作会很容易。已经有问题在这里提出并回答了。

【讨论】:

  • 谢谢,这是我需要的帮助。由于缺乏经验,我在 Google 中使用了错误的关键字。我应该搜索“Java 中的 svg 路径数据解析”而不是“Java 中的 svg 路径”。
  • 虽然有人就这个确切的问题提出过问题,但仍然没有明确的答案。在 python 中显示的方法正是我需要的,除了我在 Java 中需要它。我不知道如何在 java 和 python 之间发送信息。如果我知道这些事情,我就不会在这里了。我不是在处理不规则的形状,它主要是圆形的正方形和圆形。我一直在寻找可以给我分数的东西,但似乎没有人知道那种工具。
  • 在 JS 中也可以,通过沿路径移动对象。唯一的问题是我在Java中没有找到等效的方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
  • 2022-07-24
  • 2012-03-16
  • 2014-03-25
  • 1970-01-01
  • 2017-10-20
相关资源
最近更新 更多