XML中的Java图像编码

XML中的Java图像编码,java,xml,image,encoding,Java,Xml,Image,Encoding,我原以为我会相对容易地找到解决这个问题的办法,但现在我呼吁诸神帮助我走出这个难题 所以,我有一个图像,我想用Java将它存储在一个XML文档中。我以前在VisualBasic中通过将图像保存到流、将流转换为数组实现了这一点,然后VB的xml类能够将数组编码为base64字符串。但是,在花了几个小时在网络上搜索Java中的等效解决方案之后,我空手而归。我唯一的成功是: import it.sauronsoftware.base64.*; import java.awt.image.Buffered

我原以为我会相对容易地找到解决这个问题的办法,但现在我呼吁诸神帮助我走出这个难题

所以,我有一个图像,我想用Java将它存储在一个XML文档中。我以前在VisualBasic中通过将图像保存到流、将流转换为数组实现了这一点,然后VB的xml类能够将数组编码为base64字符串。但是,在花了几个小时在网络上搜索Java中的等效解决方案之后,我空手而归。我唯一的成功是:

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();
  }
import it.sauronsoftware.base64.*;
导入java.awt.image.buffereImage;
导入org.w3c.dom.*;
...
缓冲图像img;
元素节点;
...
java.io.ByteArrayOutputStream os=new java.io.ByteArrayOutputStream();
ImageIO.write(img,“png”,os);
字节[]数组=Base64.encode(os.toByteArray());
字符串ss=arrayToString(数组,“,”);
setTextContent(ss);
...
专用静态字符串arrayToString(字节[]a,字符串分隔符){
StringBuffer结果=新的StringBuffer();
如果(a.长度>0){
result.append(a[0]);
对于(int i=1;iApache Commons,有一个类应该对您有所帮助:

从那里,您可以直接写出字节(它们已经是可读的格式)

您的
arrayToString()
方法非常奇怪(分隔符的作用是什么?)。为什么不简单地说

String s = new String(array, "US-ASCII");
相反的操作是

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

使用ASCII编码,这在处理Base64编码的数据时应该足够了。另外,我更喜欢来自知名来源(如Apache Commons)的Base64编码器。

获取字节数组后

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>

我也做过类似的事情(在Base64中编码和解码),它的工作非常出色。下面是我认为您应该做的,使用Apache Commons项目中的类:

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

希望它能有所帮助。

基本问题是XML文档中不能有任意的ByTestStream,因此您需要以某种方式对其进行编码。常用的编码方案是BASE64,但只要收件人知道,任何方案都可以。

您不需要为此发明自己的XML数据类型。XML模式定义标准二进制数据类型,例如,这正是您正试图做的


一旦使用了标准类型,一些解析器(如XMLBeans)就可以将其自动转换为二进制。如果您的解析器不处理它,您可以在许多地方找到base64Binary的类,因为该数据类型在SOAP、XMLSec等中广泛使用。

对于Java 6,您可以使用DatatypeConverter将字节数组转换为Base64字符串:

byte[] imageData = ...
String base64String = DatatypeConverter.printBase64Binary(imageData);
并将其转换回:

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

我能够实现的最简单的实现如下所示,这是从服务器到服务器的XML传输,包含二进制数据Base64,来自Apache编解码器库: -从数据库读取二进制数据并创建XML

  • 在请求服务器上读取标记并将其保存在数据库中
尽管很容易。。 我仍在致力于实现XML流,因为它是从创建XML的第一台服务器生成的,并将其流到响应对象,这是为了在包含二进制数据的XML太大时小心

  • 维什萨胡

我知道问题在于如何通过XML对图像进行编码,但也可以通过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();}
客户端代码:

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

使用org.apache.commons.codec.binary.Base64,我将毫无帮助,但是:为什么?为什么要用XML存储图像?有没有更好的方法?如果我发现自己处于这种情况,我会重新考虑我正在做什么以及为什么。嗨,迈克,这是一个有效的观点-可能有更好的方法,我愿意接受建议XML文档的用途是存储关于一所大学的信息。它保留了一个校园数组,而校园数组又保留了一个房间数组。我存储的图像是校园地图。我认为XML可能是存储亲子数据的最佳方式。但是如果你有更好的建议,请告诉我!干杯,伙计,这是一个非常简洁的方法呃,包!谢谢Michael,无可否认,我是在抓救命稻草,并抄袭了一些人关于如何在没有真正考虑的情况下转换阵列的示例。现在使用Apaches Commons。为adviceobrigado Joao干杯!@JoaoSilva
     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();}
    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.
    }
    FileOutputStream out = new FileOutputStream("path/to/file.png");

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