Как получить размер изображения (ширину/высоту) изображения SVG с помощью батика

Как я могу получить размер (ширину/высоту) изображения SVG, используя батик (1.7)?

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

Пример может быть выполнен напрямую и представляет собой загрузку изображения с открытого сайта clip.org. В качестве альтернативы абсолютному размеру меня также интересует соотношение сторон изображения.


person Thor    schedule 02.02.2016    source источник


Ответы (1)


попробуйте этот код, кстати, SAXparser выдает ошибку в случае переданного вами изображения svg, потому что атрибут r должен быть определен для элемента круга. Я сделал свои яички на образцах svg, которые поставляются с Batik Папка образцов батика

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());

getPrimitiveBounds(): возвращает границы области, покрываемой примитивной краской этого узла. Это окрашенная область заливки и обводки, но не учитываются отсечение, маскирование или фильтрация.

курс, объясняющий батик (полезно)

person achabahe    schedule 10.02.2016
comment
Спасибо за предоставленный код, но это, кажется, еще один пример получения границ, если структура SVG идеальна, к сожалению, мне приходится обрабатывать такие искаженные документы. - person Thor; 13.02.2016
comment
на самом деле это не искаженный документ, но он использует пространство имен sodipodi для sodipodi xr: и yr: будет выполнять работу r, если они оба имеют одинаковое значение - person achabahe; 13.02.2016
comment
Я получаю намного меньшее изображение, когда я беру эти измерения и визуализирую с использованием PNGTranscoder.KEY_MAX_WIDTH и PNGTranscoder.KEY_MAX_HEIGHT, чем когда я визуализирую без назначения этих клавиш. Есть ли несоответствие единиц измерения? - person Joe Lapp; 02.05.2019
comment
Когда я вместо этого вытягиваю высоту ширины из корневого элемента документа SVG, а затем визуализирую с помощью KEY_MAX_WIDTH и KEY_MAX_HEIGHT, я получаю правильный размер. - person Joe Lapp; 02.05.2019