2016-02-02 2 views
3

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

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. В качестве альтернативы абсолютному размеру меня также интересует соотношение сторон изображения.

ответ

5

попробуйте этот код, кстати SAXParser вызывает ошибку в случае SVG изображений, которые вы прошли, так как атрибут г должен быть определены для окружности элемента я сделал мои семенники на образцах SVG, которые приходят с Батиком Batik's samples folder

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(): Возвращает границы области, покрытой примитивной краской этого узла. Это окрашенная область заливки и инсульт, но не учитывает отсечение, маскирующий или фильтрации

a course explaining batik(useful)

+0

Спасибо за предоставление кода, но это, кажется, еще один пример получения оценки, если структура SVG является Perfekt , к сожалению, мне приходится обращаться с такими искаженными документами. – Thor

+0

accualy это не искаженный документ, но он использует пространство имен sodipodi для sodipodi xr: и yr: выполнит работу r, если они оба имеют одинаковое значение – achabahe

 Смежные вопросы

  • Нет связанных вопросов^_^