使用Java从XML文件创建一个图像(png,jpg等)。

7

我有一个XML文件,想要基于其中的一些实体创建一个图形,然后将这个图形存储为图片,JPG或PNG格式。

那么在Java中是否有库可以做到这样的事情?或者通过解析XML文件有什么技巧可以实现呢?

以下是一个XML文件示例:

<?xml version="1.0"?>
<process>
  <p n="1">Tove</p> 
  <p n="2">Jani</p> 
  <p n="2">Bill</p> 
  <p n="4">John</p> 
</process>

And the output will be like this:

enter image description here


看起来http://www.graphviz.org/已经提供了您想要实现的内容。 - Rekin
3个回答

7
你可以使用众多Java XML库之一来提取名称。以下是使用XPath从Java DOM中的示例:
private static List<String> findNames(Document doc)
                                           throws XPathExpressionException {
  XPath xpath = XPathFactory.newInstance().newXPath();
  NodeList nodes = (NodeList) xpath.evaluate("/process/p", doc, 
                                                    XPathConstants.NODESET);
  List<String> names = new ArrayList<String>();
  for (int i = 0; i < nodes.getLength(); i++) {
    names.add(nodes.item(i).getTextContent());
  }
  return names;
}

注意:可能是打字错误,但您的XML格式不正确 - 属性值必须加上引号。否则,XML解析将失败。

some boxes

你可以使用 AWT API画出你想要的任何东西:
private static final int BORDER = 1;
private static final int PADDING = 2;
private static final int SPACER = 5;

private static void draw(Graphics2D g, List<String> names) {
  FontMetrics metrics = g.getFontMetrics();
  Rectangle box = new Rectangle(1, 1, 0, 0);
  box.height = metrics.getHeight() + (PADDING * 2);
  g.setColor(Color.WHITE);
  for (String name : names) {
    box.width = metrics.stringWidth(name) + (PADDING * 2);
    g.drawString(name, box.x + BORDER + PADDING, PADDING + BORDER +
                                                    metrics.getHeight());
    g.drawRect(box.x, box.y, box.width, box.height);
    box.x += box.width + (BORDER * 2) + SPACER;
  }
}

这段代码只是在名称周围绘制一些框。我确定我的偏移量都错了,但你可能已经明白了。
有一个imageio API可以保存几种流行的数据格式:
private static void save(List<String> names, File file) throws IOException {
  BufferedImage image = new BufferedImage(600, 50, BufferedImage.TYPE_INT_RGB);
  Graphics2D g = image.createGraphics();
  try {
    draw(g, names);
  } finally {
    g.dispose();
  }
  ImageIO.write(image, "png", file);
}

谢谢!我在Java中找到了一个类,它与GraphViz合作,在解析XML文件后提取最终的图片,并输出GraphViz表示形式。http://www.loria.fr/~szathmar/off/projects/java/GraphVizAPI/index.php#history - Ali Ben Messaoud

6
我会解析XML,并输出类似以下这样的Graphviz DOT表示形式:

我将解析XML,并输出类似于以下这种Graphviz DOT表示:

digraph {
  Tove -> Jani
  Jani -> Bill
  Bill -> John
}

然后,我会使用ProcessRunner从Java中调用Graphviz dot可执行文件:

dot -Tpng -o file.png file.dot

请查看http://graphviz.org获取更多信息。

0
我发现了一个很好用的Java,可以在解析XML文件后通过GraphViz创建图像,并输出GraphViz表示。欲了解更多信息,请点击此链接

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接