使用JavaFX从XML文件接收png

时间:2014-11-01 09:36:13

标签: java xml javafx

我有一个名为 Person 的班级。每个 Person 都有一个头像存储为 javafx.scene.image.Image 字段。我正在尝试将这些图像从 Persons 集合写入xml文件。

这是我写图像的方式:

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 image data @ (PersonXMLTool.java:77) BufferedImage image = ImageIO.read(byteArrayInputStream);Caused by: java.io.EOFException: Unexpected end of ZLIB input stream的原因。

起初我使用的是apache commons Base64,但它没有任何区别。在我的测试项目上,我做的是同样的,并且它有效。不同之处在于我没有将编码图像写入任何xml文件,而是使用它为我生成的String。

任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

看起来您假设字符数据全部在一个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);
                    }
                }
            }