2014-11-01 2 views
-1

나는 이라는 클래스가 있습니다. 사람입니다. 각 사람에는 javafx.scene.image.Image 필드로 저장된 아바타 이미지가 있습니다. Person 컬렉션의 이미지를 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 파일에서 찾을 수있는 것의 일부일뿐입니다.

그 이유는 @ (PersonXMLTool.java:77)BufferedImage image = ImageIO.read(byteArrayInputStream);이고 Caused by: java.io.EOFException: Unexpected end of ZLIB input stream 인 이유입니다.

처음에 나는 아파치 Commons Base64를 사용하고 있었지만 아무런 차이가 없었습니다. 내 테스트 프로젝트에서 나는 똑같이하고 있었고 효과가 있었다. 차이점은 내가 어떤 XML 파일에 인코딩 된 이미지를 작성하지 않았지만 나를 위해 생성 된 String을 사용한다는 것입니다.

도움을 주시면 감사하겠습니다.

답변

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

관련 문제