2011-03-23 138 views
2

我想从网上获取图片,并将其转换为字节数组。但是,读取回应有些问题。我怀疑它是由编码模式造成的。编码问题?

 WebRequest request = WebRequest.Create("http://www.waterfootprint.org/images/gallery/original/apple.jpg"); 
     request.Method = "GET"; 
     request.Timeout = 10000; 
     using (WebResponse response = request.GetResponse()) 
     { 
      Stream stream = response.GetResponseStream(); 
      Encoding encoding = Encoding.UTF8; 
      StreamReader streamReader = new StreamReader(stream, encoding); 

      string responseBody = streamReader.ReadToEnd(); //always invalid characters here 
      streamReader.Close(); 
      stream.Dispose(); 
      byte[] buffer = Convert.FromBase64String(responseBody); 
     } 

我已经试过其他编码方式,如UTF7,Unicode的,等等,但一切都是徒劳。有人能告诉我为什么吗?感谢

回答

2
StreamReader streamReader = new StreamReader(stream, encoding); 

StreamReader的TextReader来自在一个特定的编码字节流读取字符。

的StreamReader在特定编码设计用于字符输入 , 而Stream类被设计为 字节输入和输出。使用 StreamReader用于从标准文本文件中读取 信息行。

在你的情况,你收到的原始字节 - 你要么需要直接与Stream工作,使用BinaryReader或更高的抽象层。

 byte[] buffer = Convert.FromBase64String(responseBody); 

你所得到的数据流不是base64编码 - 这是一个纯粹的图像字节流,所以只是直接分配的字节数,最简单的将是一个WebClient

using(WebClient wc = new WebClient()) 
byte[] buffer = wc.DownloadData("http://www.waterfootprint.org/images/gallery/original/apple.jpg"); 

Base 64 encoding通常使用时您必须将二进制数据作为ASCII文本传输(即作为XML CData元素或SOAP的一部分) - 但是如果您想通过HTTP传输二进制文件(即图像),则不会。

+0

但如果在服务器端,图像只是base64encoding返回:'返回convert.FromBase64String(和imagestring);' – ChanDon 2011-03-23 03:14:25

+0

那将是不可思议 - 但是假设你可以接着使用刚刚得到的字符串'wc.DownloadString()',然后使用'Convert.FromBase64String()'将其转换回字节数组。 – BrokenGlass 2011-03-23 03:17:39

0

它以二进制形式返回,而非base-64编码。例如,如果我更改代码以直接从响应流创建图像,则会看到它出现在PictureBox控件中。

private void button1_Click(object sender, EventArgs e) 
    { 
     WebRequest request = WebRequest.Create("http://www.waterfootprint.org/images/gallery/original/apple.jpg"); 
     request.Method = "GET"; 
     request.Timeout = 10000; 
     using (WebResponse response = request.GetResponse()) 
     { 
      Stream stream = response.GetResponseStream(); 
      Bitmap b = (Bitmap)Bitmap.FromStream(response.GetResponseStream()); 
      pictureBox1.Image = b; 
     } 
    }