我想从网上获取一张图片,并将其转换为字节数组。但阅读回应有些不对劲。我怀疑它是由编码模式引起的。
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等,但都是徒劳的。有人能告诉我为什么吗?感谢
答案 0 :(得分: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");
当您必须将二进制数据作为ASCII文本(即作为XML CData元素或SOAP的一部分)传输时,通常会使用Base 64 encoding - 但如果您要传输二进制文件(即图像)则不会通过HTTP。
答案 1 :(得分: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;
}
}