使用JavaFX从XML文件接收png
我有一个名为Person的类。每个人都有一个存储为javafx.scene.image.image字段的化身图像。我正在尝试将这些图像从一组人员写入一个xml文件 这就是我写这张图片的方式:使用JavaFX从XML文件接收png,java,xml,javafx,Java,Xml,Javafx,我有一个名为Person的类。每个人都有一个存储为javafx.scene.image.image字段的化身图像。我正在尝试将这些图像从一组人员写入一个xml文件 这就是我写这张图片的方式: Image image = p.getImage(); BufferedImage img = SwingFXUtils.fromFXImage(image, null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.w
Image image = p.getImage();
BufferedImage img = SwingFXUtils.fromFXImage(image, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "png", baos);
// baos.flush();
String encodedImage = Base64.getEncoder().encodeToString(baos.toByteArray());
baos.close();
xmlEventWriter.add(xmlEventFactory.createCharacters(encodedImage));
这就是我试图阅读它的方式:
byte[] bytes = Base64.getDecoder().decode(event.asCharacters().getData());
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
BufferedImage image = ImageIO.read(byteArrayInputStream);
personImage = SwingFXUtils.toFXImage(image, null);
从xml文件读取编码图像时,问题开始出现。我没有收到完整的字符集。event.asCharacters().getData()
的值只是xml文件中的一部分
这就是为什么我收到一个javax.imageio.IIOException:Error reading PNG图像数据
@(PersonXMLTool.java:77)
,它是BufferedImage image=imageio.read(byteArrayInputStream)代码>和由以下原因引起的:java.io.EOFException:ZLIB输入流意外结束
起初我使用的是ApacheCommonsBase64,但它没有任何区别。在我的测试项目中,我也做了同样的事情,并且成功了。区别在于我没有将编码图像写入任何xml文件,而是使用它为我生成的字符串
谢谢你的帮助 看起来您假设字符数据都在一个XMLEvent
中传输。情况并非如此(除非图像很小):通常您将在多个事件中接收字符数据
因此,您需要使用以下内容解析xml文件:
XMLInputFactory inputFactory = XMLInputFactory.newFactory() ;
XMLEventReader eventReader = inputFactory.createXMLEventReader(Files.newBufferedReader(xmlFile.toPath()));
StringBuilder encodedImageBuffer = new StringBuilder();
boolean readingImage = false ;
while (eventReader.hasNext() && encodedImage == null) {
XMLEvent event = eventReader.nextEvent();
if (event.isStartElement()) {
StartElement el = event.asStartElement();
if ("image".equals(el.getName().getLocalPart())) {
readingImage = true ;
}
}
if (event.isCharacters() && readingImage) {
Characters characters = event.asCharacters();
encodedImageBuffer.append(characters.getData());
}
if (event.isEndElement()) {
EndElement el = event.asEndElement();
if ("image".equals(el.getName().getLocalPart())) {
String encodedImage = encodedImageBuffer.toString();
byte[] imageData = Base64.getDecoder().decode(encodedImage);
ByteArrayInputStream dataInputStream = new ByteArrayInputStream(imageData);
BufferedImage buffImage = ImageIO.read(dataInputStream);
Image image = SwingFXUtils.toFXImage(buffImage, null);
}
}
}