Java 如何使用Apache Sanselan库在jpg文件中重写XMP XML?
我想将XMP写入jpg。我使用apachesanselan库。在下面的代码中,我试图读取XMP XML并将其再次写入同一个文件,但得到了异常(ImageReadException:Unexpected EOF.) 如果输入和输出文件不同,代码工作正常Java 如何使用Apache Sanselan库在jpg文件中重写XMP XML?,java,apache-commons,jpeg,xmp,Java,Apache Commons,Jpeg,Xmp,我想将XMP写入jpg。我使用apachesanselan库。在下面的代码中,我试图读取XMP XML并将其再次写入同一个文件,但得到了异常(ImageReadException:Unexpected EOF.) 如果输入和输出文件不同,代码工作正常 File newfile = new File("./img/newfile.jpg"); //output file xmpWriter.updateXmpXml(new ByteSourceFile(file), new BufferedOut
File newfile = new File("./img/newfile.jpg"); //output file
xmpWriter.updateXmpXml(new ByteSourceFile(file), new BufferedOutputStream(new FileOutputStream(newfile)), xmpXml);
但是如果我读写同一个文件,我会得到一个异常
org.apache.sanselan.ImageReadException: Unexpected EOF.
at org.apache.sanselan.common.BinaryFileFunctions.readAndVerifyBytes(BinaryFileFunctions.java:129)
at org.apache.sanselan.formats.jpeg.JpegUtils.traverseJFIF(JpegUtils.java:61)
at org.apache.sanselan.formats.jpeg.xmp.JpegRewriter.analyzeJFIF(JpegRewriter.java:204)
at org.apache.sanselan.formats.jpeg.xmp.JpegXmpRewriter.updateXmpXml(JpegXmpRewriter.java:187)
at Editor$1.mouseClicked(Editor.java:147)
at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Sanselan已经加入Apache,并将在不久的将来作为Apache Commons Imaging 1.0发布。您可能想尝试更近期的库构建,可能您发现的问题已经解决。您可以在这里找到每日快照:
xmpWriter.updateXmpXml(新的ByteSourceFile(文件)、新的BufferedOutputStream(新的FileOutputStream(文件))、xmpXml)代码>以破坏性方式读取和写入同一文件。难怪。我更新到了新版本,但现在字符串xmpXml=Sanselan.getXmpXml(文件);Sansealan不被认可。如何使用新库读取xmp xml?我也尝试了使用新库,得到了相同的异常org.apache.commons.imaging.ImageReadException:意外的EOF。我遇到了相同的问题(Android上的Sanselan 0.97)。当我意识到我在评论/回答一个三年前的问题时,我想我还是分享一下我的解决方法吧。很明显,使用一个临时目标文件temp.jpg。然后,在更新temp.jpg后,只需将temp.jpg复制到dest.jpg即可。Sanselan已加入Apache,并将在不久的将来作为Apache Commons Imaging 1.0发布。您可能想尝试更近期的库构建,可能您发现的问题已经解决。您可以在这里找到每日快照:xmpWriter.updateXmpXml(新的ByteSourceFile(文件)、新的BufferedOutputStream(新的FileOutputStream(文件))、xmpXml)代码>以破坏性方式读取和写入同一文件。难怪。我更新到了新版本,但现在字符串xmpXml=Sanselan.getXmpXml(文件);Sansealan不被认可。如何使用新库读取xmp xml?我也尝试了使用新库,得到了相同的异常org.apache.commons.imaging.ImageReadException:意外的EOF。我遇到了相同的问题(Android上的Sanselan 0.97)。当我意识到我在评论/回答一个三年前的问题时,我想我还是分享一下我的解决方法吧。很明显,使用一个临时目标文件temp.jpg。然后,在更新temp.jpg之后,只需将temp.jpg复制到dest.jpg。
org.apache.sanselan.ImageReadException: Unexpected EOF.
at org.apache.sanselan.common.BinaryFileFunctions.readAndVerifyBytes(BinaryFileFunctions.java:129)
at org.apache.sanselan.formats.jpeg.JpegUtils.traverseJFIF(JpegUtils.java:61)
at org.apache.sanselan.formats.jpeg.xmp.JpegRewriter.analyzeJFIF(JpegRewriter.java:204)
at org.apache.sanselan.formats.jpeg.xmp.JpegXmpRewriter.updateXmpXml(JpegXmpRewriter.java:187)
at Editor$1.mouseClicked(Editor.java:147)
at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)