2009-08-21 29 views
10

Bu soruna nispeten kolay bir çözüm bulacağımı düşünmüştüm, ama işte bu tanrıların beni bu çekilişten çekmesi için çağırıyorum.Java - XML ​​biçiminde görüntü kodlaması

Yani, bir görüntüüm var ve bunu bir XML belgesinde Java kullanarak saklamak istiyorum. Bunu daha önce VisualBasic'te görüntüyü bir akışa kaydederek, akışı bir diziye dönüştürerek başardım ve daha sonra VB'nin xml sınıfı diziyi bir base64 dizesi olarak kodlayabildi. Ancak, Java'da eşdeğer bir çözüm için bir kaç saat ağda durduktan sonra, boş geri döndüm. Ben vardı sadece başarı ile olmuştur: sanırım tamamdır

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

ama XML dosyası imkansız olduğunu kanıtlamıştır yüklediğinizde süreci tersine geri bir resme onu almak için. Herhangi bir kullanıcının bir XML dosyasındaki bir görüntüyü kodlamak/çözmek için daha iyi bir yolu varsa, lütfen sadece iyi bir başka iş parçacığı bağlantısı olsa bile, ileriye doğru ilerleyin. peşin

Alkış,

çember.

Oradan, sadece bayt yazabiliriz (onlar okunabilir bir biçimde zaten var)

+0

Tamamen yararsızdır, ama: Neden? Resimleri neden XML'de saklamak istiyorsunuz? Bunu yapmanın daha iyi bir yolu var mı? Eğer bu durumda kendimi bulsaydım, ne yaptığımı ve neden tekrar düşünürdüm. –

+0

Merhaba Mike, geçerli bir nokta - muhtemelen daha iyi bir yol var ve önerilere açığım. XML belgesinin temel amacı bir üniversite hakkındaki bilgileri saklamaktır. O sırayla oda dizileri tutmak kampüsleri bir dizi tutar. Benim sakladığım görüntüler, kampüsler için haritalar. XML'in ebeveyn-çocuk verilerini depolamanın en iyi yolu olabileceğini düşündüm. Ama daha iyi bir öneriniz varsa lütfen bana bildirin! – Hoopla

cevap

20

gibi xml eğlenceli şeyler yapabilirsiniz Benzer bir şey (kodlama ve kod çözme Base64) ve bir cazibe gibi çalıştı. İşte Apache Commons projesinden sınıf Base64 kullanarak, yapmanız gerektiğini düşünüyorum budur:

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

yardımcı olur Umut.

+0

Hala yardım ediyor (Y) –

+0

obrigado Joao! @JoaoSilva –

8

Apache Commons size yardımcı olması gereken bir Base64 sınıfı vardır (Bu ayırıcının amacı nedir?). Neden sadece ters operasyon Base64 kodlanmış veri ile uğraşırken yeterli olmalıdır ASCII kodlama, Kullanım

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

olduğunu

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

söyleme. Ayrıca, bir Apache Commons gibi saygın bir kaynaktan bir Base64 kodlayıcı tercih ederim.

+0

Şerefe dostum, bu çok daha çekici bir paket! – Hoopla

+0

Peki neden bunu cevap olarak işaretlemiyorsunuz? –

1

Sizin arrayToString() yöntem oldukça tuhaf:

+0

Teşekkürler Michael, kuşkusuz pipet tutuyordum ve birinin gerçekten düşünmeden diziyi nasıl dönüştüreceğine dair bir örneğini kopyalamıştım. Şimdi Apaches Commons'ı kullanıyor.Tavsiye için alkış – Hoopla

2

Eğer bayt dizisi aldıktan sonra

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

kodlanmış bir dize kullanın:

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

Sonra Yaptığım

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

Temel sorun, bir XML belgesinde keyfi bir iz sürüme sahip olamamanızdır, dolayısıyla bir şekilde kodlamanız gerekir. Sık kodlama şeması BASE64'tür, ancak alıcı bunu bildiği sürece yapılacaktır.

1

Bunun için kendi XML veri türünüzü bulmanız gerekmez. XML şeması, tam olarak yapmaya çalıştığınız, base64Binary gibi standart ikili veri türlerini tanımlar.

Standart türleri kullandığınızda, bazı ayrıştırıcılar (XMLBeans gibi) tarafından otomatik olarak ikiliye dönüştürülebilir. Çözümleyiciniz bunu işlemezse, veri türü birçok yerde SOUT, XMLSec vb. Için yaygın olarak kullanıldığından base64Binary için sınıflar bulabilirsiniz.

2

Java 6 ile, bir bayt dizisini Base64'e dönüştürmek için DatatypeConverter kullanabilirsiniz. dize:

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

Ve geri dönüştürmek için: Ben yapılan başardı

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

en kolay uygulama aşağıdaki gibidir, Ve bu Base64 dan ikili veri içeren Sunucu XML transfer Server olduğunu Apache Codec kütüphanesi: - istekte bulunan sunucu üzerinde 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'den ikili veri okuma ve oluşturma etiketi okumak ve onunla
byte[] bData = strClassByteCode.getBytes("US-ASCII"); 
bData = Base64.decodeBase64(bData); 
oPrStmt.setBytes(++nParam, bData); 

kolay DB kaydedin olabilir .. Hala gen olduğu gibi XML akışını uygulamak için çalışıyorum XML'in oluşturulduğu ilk sunucudan derecelendirilir ve yanıt nesnesine aktarılır. Bu, ikili verilere sahip XML çok büyük olduğunda dikkat çekmek içindir.

  • Vishesh Sahu
0

ben soru nasıl XML yoluyla bir görüntü kodlamak için aking olduğunu biliyoruz, ama sadece yerine XML ve kodlama kullanarak bir HTTP GET isteği ile bayt akışı da mümkündür bir şekil. Girişin FileInputStream olduğunu unutmayın. Sunucu Kodu:

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

Müşteri Kodu:

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 kullanarak: Burada

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. 
    } 

bir dosyaya tamsayı listesi yazardı nasıl .codec.binary.Base64