gpt4 book ai didi

java - 如何使用 Apache Batik 库将 Graphics2D 转换为 SVGGraphics2D?

转载 作者:太空宇宙 更新时间:2023-11-04 09:39:14 26 4
gpt4 key购买 nike

我需要将 JPanel(图形)中的内容(形状)转换为 SVGGraphics2D 对象,以获得使用 Apache Batik 库生成的 svg 文件。

public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);

g2.setPaint(fg);

// draw Text
g2.drawString("Hello world!", 250, 400);

// draw Line2D.Double
g2.setPaint(orange);
g2.draw(new Line2D.Double(50, 50, 200, 200));

// draw Point2D.Double
g2.setPaint(red);
g2.fill(new Ellipse2D.Double(400, 400, 5, 5));

// draw Rectangle2D.Double
g2.setPaint(magenta);
g2.draw(new Rectangle2D.Double(600, 600, 300, 150));
g2.setPaint(magenta);
g2.draw(new Rectangle2D.Double(300, 300, 300, 150));

// draw Ellipse2D.Double
g2.setPaint(blue);
g2.draw(new Ellipse2D.Double(400, 400, 200, 200));

// draw GeneralPath (polygon)
g2.setPaint(green);
int x1Points[] = {200, 500, 300};
int y1Points[] = {100, 100, 300};
GeneralPath polygon = new GeneralPath(GeneralPath.WIND_EVEN_ODD,
x1Points.length);
polygon.moveTo(x1Points[0], y1Points[0]);

for ( int index = 1; index < x1Points.length; index++ ) {
polygon.lineTo(x1Points[index], y1Points[index]);
}

polygon.closePath();

g2.draw(polygon);
}


public void onlyWrite(){

JFrame f = new JFrame("Shapes Example2");
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}
});

// Get a DOMImplementation.
DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation();

// Create an instance of org.w3c.dom.Document.
String svgNS = "http://www.w3.org/2000/svg";
Document document = domImpl.createDocument(svgNS, "svg", null);

SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(document);
ctx.setComment("Generated from Shapes Example2");
//ctx.setEmbeddedFontsOn(true);

// Create an instance of the SVG Generator.
SVGGraphics2D svgGenerator = new SVGGraphics2D(ctx, false);

ShapesExample2 pane = new ShapesExample2();
f.getContentPane().add("Center", pane);
f.pack();
f.setSize(new Dimension(1000,1000));
f.setResizable(false);
f.setVisible(true);

svgGenerator = (SVGGraphics2D)pane.getGraphics();

// Finally, stream out SVG to the standard output using
// UTF-8 encoding.
boolean useCSS = false; // we want to use CSS style attributes

String svgFile = "example2.svg";

try {
OutputStream outputStream = new FileOutputStream(svgFile);
Writer outputStreamWriter = new OutputStreamWriter(outputStream);
svgGenerator.stream(outputStreamWriter, useCSS);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

}

转换 SVGGraphics2D 我遇到以下异常:

Exception in thread "main" java.lang.ClassCastException: sun.java2d.SunGraphics2D cannot be cast to org.apache.batik.svggen.SVGGraphics2D at ShapesExample2.onlyWrite(ShapesExample2.java:122) at ShapesExample2.main(ShapesExample2.java:144)

如何获取 svg 文件?谢谢!

最佳答案

尝试相反的方式,SVGGraphics2DGraphics2D 的子类,Graphics2D 不是 SVGGraphics2D 的子类。

因此,只需将 SVG 图形对象传递给组件的 Paint 方法即可。

pane.paintComponent(svgGenerator);

您可以在此处查看更多示例:Apache Batik SVG Generator

关于java - 如何使用 Apache Batik 库将 Graphics2D 转换为 SVGGraphics2D?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56164645/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com