2009-08-21 4 views
10

나는이 문제에 대한 해결책을 비교적 쉽게 찾을 수있을 것이라고 생각했지만, 여기서 나는이 수수께끼에서 나를 끌어 내려는 신의 도움을 요청하고있다.Java - XML의 이미지 인코딩

그래서 이미지가 있고 Java를 사용하여 XML 문서에 저장하고 싶습니다. 이전에 VisualBasic에서 이미지를 스트림에 저장하고 스트림을 배열로 변환 한 다음 VB의 xml 클래스에서 배열을 base64 문자열로 인코딩 할 수있었습니다. 그러나 자바에서 동등한 솔루션을 찾기 위해 2 시간 동안 인터넷을 샅샅이 뒤지면서 저는 빈손으로 돌아 왔습니다. 내가 가진 한 유일한 성공으로되었습니다 것 같아요 괜찮

import it.sauronsoftware.base64.*; 
import java.awt.image.BufferedImage; 
import org.w3c.dom.*; 

... 

     BufferedImage img; 
     Element node; 

     ... 

     java.io.ByteArrayOutputStream os = new java.io.ByteArrayOutputStream(); 

     ImageIO.write(img, "png", os); 

     byte[] array = Base64.encode(os.toByteArray()); 

     String ss = arrayToString(array, ","); 

     node.setTextContent(ss); 

     ... 

    private static String arrayToString(byte[] a, String separator) { 
    StringBuffer result = new StringBuffer(); 
    if (a.length > 0) { 
     result.append(a[0]); 
     for (int i=1; i<a.length; i++) { 
      result.append(separator); 
      result.append(a[i]); 
     } 
    } 
    return result.toString(); 
    } 

,하지만 난 XML 파일이 불가능 입증했다로드 할 때 과정을 반전하는 것은 다시 이미지에 그것을 얻을 수 있습니다. 누구나 XML 파일에서 이미지를 인코딩/디코딩하는 더 좋은 방법이있는 경우 다른 스레드에 대한 링크 일지라도 앞으로 나아가십시오.

건배,

Hoopla.

이 거기에서, 당신은 단지 바이트를 쓸 수 있습니다 (그들이 읽을 수있는 형식으로 이미)

+0

나는 갈거야. 전혀 도움이되지 않지만 왜? 왜 XML로 이미지를 저장하고 싶습니까? 이 작업을 수행하는 더 좋은 방법이 있습니까? 이런 상황에서 자신을 발견하면, 내가하고있는 일과 그 이유를 다시 생각해 볼 것입니다. –

+0

안녕하세요, Mike, 유효한 시점입니다. 더 나은 방법이있을 수 있으며 제안을드립니다. XML 문서의 주된 목적은 대학에 대한 정보를 저장하는 것입니다. 그것은 캠퍼스의 배열을 유지하고 차례로 배열을 유지합니다. 저장하고있는 이미지는 캠퍼스지도입니다. 아마도 XML이 부모 - 자식 데이터를 저장하는 가장 좋은 방법이라고 생각했습니다. 그러나 더 나은 제안이 있다면 알려 주시기 바랍니다. – Hoopla

답변

20

처럼 XML 재미 일을 할 수 있습니다 비슷한 (Base64에서의 인코딩과 디코딩) 그리고 그것은 매력처럼 작동했습니다. 여기에 나는 아파치 코 몬즈 프로젝트에서 클래스 Base64를 사용하여, 당신이해야 할 생각입니다 :

// ENCODING 
BufferedImage img = ImageIO.read(new File("image.png"));  
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ImageIO.write(img, "png", baos);  
baos.flush(); 
String encodedImage = Base64.encodeToString(baos.toByteArray()); 
baos.close(); // should be inside a finally block 
node.setTextContent(encodedImage); // store it inside node 

// DECODING 
String encodedImage = node.getTextContent(); 
byte[] bytes = Base64.decode(encodedImage); 
BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes)); 

는 도움이되기를 바랍니다.

+0

아직 도움이 (Y) –

+0

오하이오 Joao! @ 조오 실바 –

8

아파치 코 몬즈 당신에게 도움이 될해야 Base64 클래스가 (그 구분 기호의 요점은 무엇입니까?). 이유는 단순히 그 반대 작업을 Base64로 인코딩 된 데이터를 처리 할 때 충분해야 ASCII 인코딩을 사용

byte[] array = s.getBytes("US-ASCII"); 

입니다

String s = new String(array, "US-ASCII"); 

말을하지. 또한 Apache Commons와 같은 평판 좋은 출처의 Base64 인코더를 선호합니다.

+0

건배 동료, 그건 훨씬 깔끔한 패키지입니다! – Hoopla

+0

답변으로 표시하지 않으시겠습니까? –

1

귀하의 arrayToString() 방법은 오히려 기괴한 :

+0

감사합니다 마이클, 틀림없이 나는 빨대로 쥐고 있었고 실제로 그것에 대해 생각하지 않고 배열을 변환하는 방법에 대한 누군가의 모범을 복사했습니다. Apaches Commons를 사용 중입니다.건배에 대한 조언 – Hoopla

2

당신이 당신의 바이트 배열을 얻을 후

byte[] array = Base64.encode(os.toByteArray()); 

는 인코딩 된 문자열 사용

String encodedImg = new String(array, "utf-8"); 

그럼 당신은 내가했던

<binImg string-encoding="utf-8" bin-encoding="base64" img-type="png"><![CDATA[ encodedIImg here ]]></binImg> 
0

기본적인 문제는 XML 문서에 임의의 바이트 스트림을 가질 수 없기 때문에 어떻게 든 인코딩해야한다는 것입니다. 빈번한 인코딩 체계는 BASE64이지만, 수령인이 그것에 대해 알고있는 한 모든 것이 가능합니다.

1

이 경우 사용자 고유의 XML 데이터 유형을 만들 필요가 없습니다. XML 스키마는 수행하려는 작업과 정확히 일치하는 표준 이진 데이터 유형 (예 : base64Binary)을 정의합니다.

표준 형식을 사용하면 XMLBeans와 같은 일부 파서에서 자동으로 이진 형식으로 변환 할 수 있습니다. 파서가 처리하지 않으면 데이터 유형이 SOAP, XMLSec 등에서 널리 사용되므로 base64Binary 클래스를 여러 위치에서 찾을 수 있습니다.

2

Java 6에서는 DatatypeConverter를 사용하여 바이트 배열을 Base64 문자열 :

byte[] imageData = ... 
String base64String = DatatypeConverter.printBase64Binary(imageData); 

그리고 그것을 다시 변환 : 내가 만든 수 있었다

String base64String = ... 
byte[] imageData = DatatypeConverter.parseBase64Binary(base64String); 
1

가장 쉬운 구현은 다음과 같습니다, 그리고 이것은 Base64로가에서 2 진 데이터를 포함하는 서버 XML에 전송하는 서버에서이다 Apache 코덱 라이브러리 : - 요청 서버에 XML

Blob blobData = oRs.getBlob("ClassByteCode"); 
byte[] bData = blobData.getBytes(1, (int)blobData.length()); 
bData = Base64.encodeBase64(bData); 
String strClassByteCode = new String(bData,"US-ASCII"); 
  • DB에서 이진 데이터를 읽고 작성이 태그를 읽고 같은
byte[] bData = strClassByteCode.getBytes("US-ASCII"); 
bData = Base64.decodeBase64(bData); 
oPrStmt.setBytes(++nParam, bData); 

쉽게 DB에 저장 될 수 있습니다 .. 나는 여전히 유전자의 XML 스트리밍을 구현하고 있습니다. XML이 작성된 첫 x 째 서 v에서 정격을 지정하여 응답 오브젝트로 스트리밍하면, 2 진 데이터가있는 XML이 너 + 클 때주의를 기울입니다.

  • Vishesh Sahu
0

나는 질문은 어떻게 XML을 통해 이미지를 인코딩하는 aking 것을 알고 있지만, 단지 대신 XML 인코딩을 사용하는 HTTP GET 요청을 통해 바이트를 스트리밍 할 수도 있습니다 이미지. 입력은 FileInputStream입니다. 서버 코드 :

 File f = new File(uri_string); 
    FileInputStream input = new FileInputStream(f); 
    OutputStream output = exchange.getResponseBody(); 

    int c = 0; 
    while ((c = input.read()) != -1) {       
     output.write(c); //writes each byte to the exchange.getResponseBody(); 

    } 

    result = new DownloadFileResult(int_list); 
    if (input != null) {input.close();} 
    if (output != null){ output.close();} 

클라이언트 코드 :

FileOutputStream out = new FileOutputStream("path/to/file.png"); 

    for(int i : result_bytes_list){ 
      out.write(i); 
    } 
    out.close(); 
0
node.setTextContent(base64.encodeAsString(fileBytes)) 

org.apache.commons를 사용하여 : 여기

InputStream input = connection.getInputStream(); 
    List<Integer> l = new ArrayList<>(); 
    int b = 0; 
    while((b = input.read()) != -1){ 
     l.add(b);//you can do what you wish with this list of ints ie- write them to a file. see code below. 
    } 

당신이 파일에 정수 목록을 작성하는 방법이다 .codec.binary.Base64