2009-08-21 5 views
10

私はこの問題の解決策を比較的簡単に見つけることができると思っていましたが、私はあなたの神の助けを借りてこの難点から私を引き抜こうとしています。Java - XMLによるイメージエンコーディング

画像があり、Javaを使用してXML文書に保存したいと考えています。私はこれまでVisualBasicで画像をストリームに保存し、ストリームを配列に変換してから、VBのxmlクラスで配列をbase64文字列としてエンコードすることでこれを実現しました。しかし、Javaの同等のソリューションのためにネットを精練して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

こんにちはマイク、それは有効な点です - おそらくもっと良い方法があり、私は提案をします。 XML文書の主な目的は、大学に関する情報を保存することです。それは順番に部屋の配列を保持するキャンパスの配列を保持します。私が保管している画像はキャンパス用のマップです。おそらくXMLは親子データを格納する最良の方法だと思っていました。しかし、より良い提案があれば教えてください! – Hoopla

答えて

20

を私がやりました似たようなもの(Base64でのエンコーディングとデコード)は魅力的でした。ここではApache Commonsプロジェクトからのクラス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

オオカミジョアオ! @JoaoSilva –

8

のApache Commonsのはあなたに助けになるはずですBase64クラスを持っています(セパレータのポイントは何ですか?)なぜ単に逆の操作が

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

ある

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

を言わないBase64でエンコードされたデータを扱う際に十分なものでなければならないASCIIエンコーディングを使用します。また、私はApache Commonsのような評判の良いソースからのBase64エンコーダが好きです。

+0

元気いっぱい、それははるかにきれいなパッケージです! – Hoopla

+0

これを答えとしてマークしてみませんか? –

1

あなたarrayToString()方法はかなり奇妙です:

+0

マイケルに感謝して、わたしはわらとして握っていて、本当にそれを考えずに配列を変換する方法の例をコピーしました。 Apach Commonsを使っています。アドバイスのための乾杯 – Hoopla

2

あなたはバイト配列

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

は、エンコードされた文字列を使用して取得した後:

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

次にあなたがXMLで楽しいことを行うことができますよう

<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から提示されたバイナリデータを含むサーバーの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が作成された最初のサーバーから評価され、応答オブジェクトにストリームされます。これは、バイナリデータを含むXMLが大きすぎる場合に注意することです。

  • ヴィシェシュSahu
0

私は質問がXMLを介して画像をエンコードする方法akingたことを知っているが、それだけでHTTPのGETの代わりにXMLを使用しての要求とエンコーディングを経由してバイトをストリーミングすることも可能です画像。入力は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