2013-04-22 108 views
4

我想使用Batik库将BufferedImage绘制成SVG文件。我对EPS/PS文件非常相似的代码工作正常,但由于某些原因,下面的代码:Batik SVGGraphics2D nullpointerexception绘制图像时

// Get a DOMImplementation and create an XML document 
DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation(); 
Document document = domImpl.createDocument(null, "svg", null); 

// Create an instance of the SVG Generator 
SVGGraphics2D svgGenerator = new SVGGraphics2D(document); 

// draw from image into the svg: 
svgGenerator.drawImage(image,new RescaleOp((float)1.0,(float)0.0,null),0,0); 

// Write svg file 
OutputStream outputStream = new FileOutputStream(svgFile); 
Writer out = new OutputStreamWriter(outputStream, "UTF-8"); 

//svgGenerator.stream(out, true /* use css */); 

// write and close file:     
outputStream.flush(); 
outputStream.close(); 

结果在svgGenerator.drawImage(...)线一个NullPointerException。由于基本上相同的命令正在为AbstractPSDocumentGraphics2D(在另一种方法中)工作,所以我不知道这里有什么问题。

编辑: 图像是在别处声明的(一个类变量,这个代码在该类的一个方法内)。

这里是一个堆栈跟踪:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at org.apache.batik.svggen.ImageHandlerBase64Encoder.encodeImage(ImageHandlerBase64Encoder.java:157) 
at org.apache.batik.svggen.ImageHandlerBase64Encoder.handleHREF(ImageHandlerBase64Encoder.java:133) 
at org.apache.batik.svggen.ImageHandlerBase64Encoder.handleHREF(ImageHandlerBase64Encoder.java:72) 
at org.apache.batik.svggen.DefaultImageHandler.handleImage(DefaultImageHandler.java:63) 
at org.apache.batik.svggen.SimpleImageHandler.handleImage(SimpleImageHandler.java:100) 
at org.apache.batik.svggen.SVGGraphics2D.drawImage(SVGGraphics2D.java:677) 
at org.apache.batik.svggen.SVGGraphics2D.drawImage(SVGGraphics2D.java:996) 
at SciTK.SciTK_Image.exportImageAsSVG(SciTK_Image.java:1232) 
at SciTK.SciTK_Image.save_image(SciTK_Image.java:428) 
at SciTK.SciTK_Image$7.actionPerformed(SciTK_Image.java:982) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
at javax.swing.AbstractButton.doClick(AbstractButton.java:376) 
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833) 
at com.apple.laf.AquaMenuItemUI.doClick(AquaMenuItemUI.java:157) 
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877) 
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289) 
at java.awt.Component.processMouseEvent(Component.java:6505) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
at java.awt.Component.processEvent(Component.java:6270) 
at java.awt.Container.processEvent(Container.java:2229) 
at java.awt.Component.dispatchEventImpl(Component.java:4861) 
at java.awt.Container.dispatchEventImpl(Container.java:2287) 
at java.awt.Component.dispatchEvent(Component.java:4687) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
at java.awt.Container.dispatchEventImpl(Container.java:2273) 
at java.awt.Window.dispatchEventImpl(Window.java:2719) 
at java.awt.Component.dispatchEvent(Component.java:4687) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729) 
at java.awt.EventQueue.access$200(EventQueue.java:103) 
at java.awt.EventQueue$3.run(EventQueue.java:688) 
at java.awt.EventQueue$3.run(EventQueue.java:686) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
at java.awt.EventQueue$4.run(EventQueue.java:702) 
at java.awt.EventQueue$4.run(EventQueue.java:700) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:699) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 
+1

什么是'图像'?堆栈跟踪在哪里? – BobTheBuilder 2013-04-22 03:22:45

+0

回答于编辑上面 – 2013-04-22 03:40:55

+0

图像是否可能为空? – BobTheBuilder 2013-04-22 03:41:33

回答

10

为他人着想谷歌搜索这个...我有 - 我相信 - 同样的问题。

假设蜡染1.7:低级原因是:ImageHandlerBase64Encoder.encodeImage()呼叫:

ImageWriter writer = ImageWriterRegistry.getInstance().getWriterFor("image/png"); 
writer.writeImage(buf, os); 

ImageWriterRegistry是空的,所以它返回null从getWriterFor("image/png")因此writer.writeImage(buf, os);模具。

注册表为空的原因是缺少类路径中的JAR。我认为特别需要的是batik-codec.jar,但我只是添加了所有的蜡染JAR。

您可以下载蜡染的来源和查看器,与该JAR文件的“图像/ PNG”等形式获得注册(以ImageWriterRegistry.getInstance()第一次调用创建实例,它的构造函数调用setup()这又遍历所有ImageWriter服务提供商 - 这应该是一个非正确的类路径的空集。)

+1

+1您刚刚为我节省了2个小时的调试时间。添加'batik-codec'作为依赖使得'NullPointerException'消失。 – Asaph 2014-03-03 06:25:47

+4

也适用于那些来自google的用户:'batik-code-1.8.jar'目前已破解,请参阅https://issues.apache.org/jira/browse/BATIK-1146。当调用setup()时会引发一些'ClassNotFoundException'异常,这会导致ImageWriterRegistry.getInstance()。getWriterFor(“image/png”)'返回'null',从而在下一行抛出'NullPointerException' – 2016-04-14 11:32:29

+2

@micheleb谢谢你说1.8已经坏了 - 我一直在努力。 – 2016-08-04 16:18:26