XML中的Java图像编码
我原以为我会相对容易地找到解决这个问题的办法,但现在我呼吁诸神帮助我走出这个难题 所以,我有一个图像,我想用Java将它存储在一个XML文档中。我以前在VisualBasic中通过将图像保存到流、将流转换为数组实现了这一点,然后VB的xml类能够将数组编码为base64字符串。但是,在花了几个小时在网络上搜索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
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 ) )