使用httpwebrequest将图像从网站获取到byte []

时间:2010-08-04 15:47:22

标签: silverlight

我想在网站上阅读PNG文件的原始二进制文件并将其存储到byte []中,到目前为止,我有类似这样的内容:

            Uri imageUri = new Uri("http://www.example.com/image.png");
            // Create a HttpWebrequest object to the desired URL.
            HttpWebRequest imgRequest = (HttpWebRequest)WebRequest.Create(imageUri);
                using (HttpWebResponse imgResponse = (HttpWebResponse)imgRequest.GetResponse())
            {
                using (BinaryReader lxBR = new BinaryReader(imgResponse.GetResponseStream()))
                {
                    using (MemoryStream lxMS = new MemoryStream())
                    {
                        lnBuffer = lxBR.ReadBytes(1024);
                        while (lnBuffer.Length > 0)
                        {
                            lxMS.Write(lnBuffer, 0, lnBuffer.Length);
                            lnBuffer = lxBR.ReadBytes(1024);
                        }
                        lnFile = new byte[(int)lxMS.Length];
                        lxMS.Position = 0;
                        lxMS.Read(lnFile, 0, lnFile.Length);
                    }
                }
            }

但是我不能在Silverlight上使用GetResponse,因为它不是异步的(我认为这就是原因)所以我应该使用BeginGetResponse,但我不完全清楚如何去吧。这就是我到目前为止所做的:

                HttpWebResponse imgResponse = (HttpWebResponse)imgRequest.BeginGetResponse(new AsyncCallback(WebComplete), imgRequest);

            using (imgResponse)
            {
                using (BinaryReader lxBR = new BinaryReader(imgResponse.GetResponseStream()))
                {
                    /*Same*/
                }
            }

        void WebComplete(IAsyncResult a)
    {
        HttpWebRequest req = (HttpWebRequest)a.AsyncState;
        HttpWebResponse res = (HttpWebResponse)req.EndGetResponse(a);
        //...? Do I need something else here?
    }

有人可以解释一下如何使用BeginGetResponse属性以及如何使用AsyncCallback。 谢谢!

注意: 我是Silverlight的新手,我一直在关注StackOverflow上的教程并从其他响应中借用: (stackoverflow responce) what I need to do but not in silverlight

tutorial

WebRequest_in_Silverlight

这是有效的Silverlight代码吗?

HttpWebResponse imgResponse = (HttpWebResponse)imgRequest.BeginGetResponse(new AsyncCallback(WebComplete), imgRequest);

2 个答案:

答案 0 :(得分:4)

让它工作,想在这里发布以防万一有人需要它。

我需要获取此图像然后修改它(字节级别)Silverlight不允许我将图像直接保存到WriteableBitmap因此我必须使用WebClient获取图像流然后将其保存到byte[]

这就是我获取图像的方式(我已经有了特定的Uri):

 WebClient wc = new WebClient();
 wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
 wc.OpenReadAsync(uri)

因此,当加载图像时,会调用wc_OpenReadCompleted方法,它会执行以下操作:

int lengthInBytes = Convert.ToInt32(e.Result.Length);
BinaryReader br = new BinaryReader(e.Result);

byte[] buffer = new byte[lengthInBytes];
using (br)
{
    for (int i = 0; i < lengthInBytes; i++)
    {
        buffer[i] = br.ReadByte();
    }
}

最后buffer[]包含图像的所有字节(我想要的) 我确信有更好的方法可以做到这一点,但这对我有用! )

注意:在某些时候我需要将byte []转换为BitmapImage(比预期的更容易):

        //imageInBytes is a byte[]

        if (imageInBytes != null)
        {
            MemoryStream rawBytesStream = new MemoryStream(imageInBytes);
            BitmapImage img = new BitmapImage();
            img.SetSource(rawBytesStream);
            return img;
        }

我希望这对任何人都有帮助。

答案 1 :(得分:1)

使用OpenReadAsync对象的WebClient方法。附加到OpenReadCompleted的{​​{1}}事件。使用事件参数的WebClient属性提供的Stream

考虑设置Result,这会在提升AllowReadStreamBuffering之前填充整个流。无论哪种情况,您都可以使用此流来完成真正的任务,而不是将其复制到MemoryStream中。

相关问题