当前位置: 首页 > 知识库问答 >
问题:

如何用蜡染获得SVG图像的尺寸(宽/高)

巩镜
2023-03-14

如何使用蜡染 (1.7) 获取 SVG 图像的大小(宽度/高度)?

String s = "https://openclipart.org/download/228858";
InputStream is = new URL(s).openStream();

DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = f.newDocumentBuilder();
Document doc = builder.parse(is);

SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(doc);
SVGGraphics2D svg = new SVGGraphics2D(ctx,false);

Dimension d = svg.getSVGCanvasSize();
Rectangle r = svg.getClipBounds();

System.out.println(svg.toString()); //org.apache.batik.svggen.SVGGraphics2D[font=java.awt.Font[family=Dialog,name=sanserif,style=plain,size=12],color=java.awt.Color[r=0,g=0,b=0]]
System.out.println("Dimension null? "+(d==null)); //true
System.out.println("Rectangle null? "+(r==null)); //true

该示例可以直接执行,并从开放的clipart.org下载图像。除了绝对尺寸,我还对图像的长宽比感兴趣。

共有2个答案

郭修平
2023-03-14

要获得SVG图像的尺寸和比例,检查SVG图像的< code>viewBox属性就足够了。

SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(
    XMLResourceDescriptor.getXMLParserClassName());

File file = new File("C:/resources/chessboard.svg");
InputStream is = new FileInputStream(file);

Document document = factory.createDocument(
    file.toURI().toURL().toString(), is);

String viewBox = document.getDocumentElement().getAttribute("viewBox");
String[] viewBoxValues = viewBox.split(" ");
if (viewBoxValues.length > 3) {
    width = Integer.parseInt(viewBoxValues[2]);
    height = Integer.parseInt(viewBoxValues[3]);
}

在这段代码中,我们检查< code>viewBox属性,如果它存在并且有4个值,我们取第3个(宽度)和第4个(高度)。

侯英达
2023-03-14

试试这段代码,顺便说一下,SAXparser在您传递的svg图像的情况下引发错误,因为属性r应该为圆元素定义,我在Batik Batik的样本文件夹中附带的svg样本上做了睾丸

SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(
                XMLResourceDescriptor.getXMLParserClassName());

        File file = new File("C:/resources/chessboard.svg");
        InputStream is = new FileInputStream(file);

        Document document = factory.createDocument(
                file.toURI().toURL().toString(), is);
        UserAgent agent = new UserAgentAdapter();
        DocumentLoader loader= new DocumentLoader(agent);
        BridgeContext context = new BridgeContext(agent, loader);
        context.setDynamic(true);
        GVTBuilder builder= new GVTBuilder();
        GraphicsNode root= builder.build(context, document);

        System.out.println(root.getPrimitiveBounds().getWidth());
        System.out.println(root.getPrimitiveBounds().getHeight());

getPrimitiveB的():返回该节点的原始绘制所覆盖的区域的边界。这是填充和笔画的绘制区域,但不考虑剪切、掩码或过滤

蜡染解释课程(有用)

 类似资料:
  • 当使用Apache Batik从SVG转换为PNG时,我有时会出现奇怪的错误。例如,对于这个SVGhttps://www.macstories.net/app/themes/macstories4/images/logo-shape-bw.svg它会抛出一个异常,但对于这个https://upload.wikimedia.org/wikipedia/commons/0/02/SVG_logo.sv

  • 问题内容: 为什么下面的代码返回高度:-1,这意味着高度未知。如何获得图像的高度? 问题答案: 使用ImageIO.read(URL)或ImageIO.read(File)代替。加载时它将阻塞,返回后将知道图像的宽度和高度。 例如 或者,MediaTracker向由异步加载的映像中添加A ,Toolkit然后等待其完全加载。

  • 问题内容: 如何使用PIL或任何其他Python库获取图片边的大小? 问题答案: 根据文档。

  • 问题内容: 目前,我正在使用: 尽管此方法可行,但最终得到的图像大小不同(有些是纵向的,有些是横向的),但是我希望所有图像都具有精确的尺寸。也许是明智的选择? 更新: 我不介意裁剪图像的一小部分。当我说明智的耕作时,我的意思是这样的算法: 问题答案: 这是我对图像进行填充拟合的观点: 它首先使用缩略图操作将图像降低到原始范围内并保留宽高比。然后将其裁剪掉以实际填充边界的大小(因为除非原始图像为正方

  • 当我将Swing组件(比如JButton)添加到JPanel时,它会以“首选大小”呈现。 但是,首选的尺寸实际上比涂上的按钮要大。它周围似乎有一个看不见的边界。 下面是一个带有测试面板的简单框架: 我的问题是,我如何确定绘制按钮的宽度和高度,而不是JButton的PreferredSize? 非常感谢任何帮助,谢谢! 因为我实际上需要它来处理所有的Swing组件,下面是一个包含更多组件的屏幕快照。

  • 问题内容: 我已经在Swing Applet的JPanel上绘制了一个正方形,现在我想在纸上打印这个 物理尺寸为50cm * 50 cm的正方形。这意味着在现实世界中正方形的打印尺寸为50 * 50 cm小程序 的 面板。 打印机使用 400 DPI 进行打印。 那么如何将这些与测量联系起来?我应该以哪种文件格式保存我的图形,以便在打印时可以进行准确的测量,等于打印机DPI,并且可以在打印中保持图