Как сериализовать изображения из удаленного URL в IsolateStorage или в XML? - PullRequest
2 голосов
/ 15 ноября 2010

Мне нужно загрузить изображения с удаленного URL-адреса и сериализовать их в изолированное хранилище, но у меня возникли проблемы с выяснением, как заставить это работать, в настоящее время я сериализую URI для изображений - и могу заставить это работать, но хотите загрузить изображение и сохранить его в файловой системе, что является лучшим способом сделать это, используя C # и Silverlight.

Я пытался найти некоторые способы сделать это, но они слишком сложны, если возможно, я могу сохранить данные изображения в XML, если это решение, но я просто хочу скачать файл - .NETна рабочем столе есть много способов сделать это, но мне нужно решение Silverlight.

Если есть какие-либо примеры, демонстрирующие такого рода вещи, то это тоже может помочь - это кажется простой проблемой, но я не могу ее решить и перепробовал много вещей, чтобы сделать эту работу просто, чтобы я могсохранить изображение с удаленного URL-адреса в IsolatedStorage и сделать это асинхронно.

У меня есть какой-то код, который делает это в данный момент, но я не могу его упростить, опубликую его, если не будет опубликовано подходящих альтернатив.

Ответы [ 2 ]

2 голосов
/ 07 сентября 2012

Я использовал следующее:

WebClient client = new WebClient();
byte[] bytes = client.DownloadData("http://cdn.sstatic.net/stackoverflow/img/apple-touch-icon.png");
2 голосов
/ 16 ноября 2010

Попробуйте этот класс.Я надеюсь, это поможет вам.
Чтобы начать захват, используйте:

   ImageGrabber grabber = new ImageGrabber();
   grabber.GrabImage(@"http://www.google.com.ua/images/srpr/nav_logo25.png");

Кстати, в этом примере я использовал очень хороший метод , который позволяет читать байты из потокадаже если этот поток не поддерживает операцию поиска).

public class ImageGrabber
{
    public void GrabImage(string url)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "POST";
        request.BeginGetRequestStream(RequestCallback, request);
    }

    private void RequestCallback(IAsyncResult asynchronousResult)
    {
        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;          
        request.BeginGetResponse(GetResponseCallback, request);
    }

    private void GetResponseCallback(IAsyncResult asynchronousResult)
    {
        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

        // End the operation
        HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
        Stream streamResponse = response.GetResponseStream();

        byte[] bytes = ReadToEnd(streamResponse);
        //save image to isolated storage as file.png
        IsolatedStorageFile.GetUserStoreForApplication().CreateFile("file.png").Write(bytes, 0, bytes.Count());
    }

    private static byte[] ReadToEnd(Stream stream)
    {
        long originalPosition = stream.Position;
        stream.Position = 0;

        try
        {
            byte[] readBuffer = new byte[4096];

            int totalBytesRead = 0;
            int bytesRead;

            while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0)
            {
                totalBytesRead += bytesRead;

                if (totalBytesRead == readBuffer.Length)
                {
                    int nextByte = stream.ReadByte();
                    if (nextByte != -1)
                    {
                        byte[] temp = new byte[readBuffer.Length * 2];
                        Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length);
                        Buffer.SetByte(temp, totalBytesRead, (byte)nextByte);
                        readBuffer = temp;
                        totalBytesRead++;
                    }
                }
            }

            byte[] buffer = readBuffer;
            if (readBuffer.Length != totalBytesRead)
            {
                buffer = new byte[totalBytesRead];
                Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead);
            }
            return buffer;
        }
        finally
        {
            stream.Position = originalPosition;
        }
    }
}

Файл будет сохранен в изолированном хранилище:

{System drive}:\Users\{User Name}\AppData\LocalLow\Microsoft\Silverlight\is\{bunch of autogenerated folders}\file.png
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...