2014-11-01 43 views
-1

我有一个名为的人。每个有一个存储为javafx.scene.image.Image字段的头像图像。我试图将这些图像从集合写入一个xml文件。使用JavaFX从XML文件接收PNG

这是我怎么写的图像:

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)); 

这就是我是多么想读它:从XML文件中读取编码的图像时

byte[] bytes = Base64.getDecoder().decode(event.asCharacters().getData()); 
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes); 
BufferedImage image = ImageIO.read(byteArrayInputStream); 
personImage = SwingFXUtils.toFXImage(image, null); 

问题开始。我没有收到整套字符。 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文件,而是使用它为我生成的字符串。

任何帮助表示赞赏。

回答

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); 
        } 
       } 
      } 
+0

感谢您的帮助!现在正在工作。 – kpeek 2014-11-02 08:33:16