Использование httpwebrequest для получения изображения с веб-сайта в байт [] - PullRequest
4 голосов
/ 04 августа 2010

Я хочу прочитать необработанный двоичный файл PNG-файла на веб-сайте и сохранить его в байте [], пока у меня есть что-то вроде этого:

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

, но я не могу использовать GetResponse в Silverlight, потому что он не асинхронный (я думаю, что причина), поэтому вместо этого я должен использовать 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), что мне нужно делать, но не в silverlight

учебник

WebRequest_in_Silverlight

это действительный код Silverlight?

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

Ответы [ 2 ]

4 голосов
/ 07 августа 2010

Получилось, хочу опубликовать его здесь на случай, если кому-то это понадобится.

Мне нужно получить это изображение и затем изменить его (уровень байтов) 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[] имеет все байтыизображение (то, что я хотел) Я уверен, что есть лучшие способы сделать это, но это работает для меня!)

примечание: в какой-то момент мне нужно преобразовать байт [] в BitmapImage (это оказалось проще, чем ожидалось):

        //imageInBytes is a byte[]

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

Надеюсь, это кому-нибудь поможет.

1 голос
/ 04 августа 2010

Используйте метод OpenReadAsync объекта WebClient.Присоединиться к событию OpenReadCompleted из WebClient.Используйте Stream, предоставленное свойством Result аргументов события.

Рассмотрите возможность установки AllowReadStreamBuffering, это заполнит весь поток перед поднятием OpenReadCompleted.В любом случае вполне вероятно, что вы можете использовать этот поток для выполнения вашей реальной задачи, а не копировать его в MemoryStream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...