Ошибка указателя нулевой ссылки на WriteableBitmap при попытке сохранить изображение в WP7

Не знаю почему, и два дня пробуя разные вещи я ни к чему не привела. Продолжайте получать NRP в строке WriteableBitmap. Вы можете видеть, что я пытался и закрыть и очистить (и оба вместе) поток.
Любые идеи были бы хорошы.

 IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication();
        XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
        XDocument document = XDocument.Load(myIsolatedStorage.OpenFile("Selections.xml", FileMode.Open));
        MyClass enclaves = (MyClass)serializer.Deserialize(document.CreateReader());
        enclavesList.ItemsSource = enclaves.Collection1;

            foreach (XElement xencl in document.Descendants("rest"))
               {

            WebClient downloader = new WebClient();
            String theelement = xencl.Element("couplink").Value;
            String nameElement = xencl.Element("coup").Value;
            String uriring = theelement.ToString();
            Uri uri = new Uri(uriring, UriKind.RelativeOrAbsolute);
            downloader.DownloadStringCompleted += new DownloadStringCompletedEventHandler(enclavesDownloaded);
            downloader.DownloadStringAsync(uri);

            Random random = new Random();
            int randomNumber = random.Next(0, 100);

            using (IsolatedStorageFile newIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
            {
                String tempJPEG = randomNumber.ToString();

                IsolatedStorageFileStream fileStream = newIsolatedStorage.CreateFile(tempJPEG);
                //fileStream.Close();
                //fileStream.Flush();
                BitmapImage image = new BitmapImage(new Uri("" + uri ));
                image.CreateOptions = BitmapCreateOptions.None;
                WriteableBitmap wb = new WriteableBitmap(image);
                System.Windows.Media.Imaging.Extensions.SaveJpeg(wb, fileStream, wb.PixelWidth, wb.PixelHeight, 0, 85);
              }
           }
         }

Я гуглил, пока не ослеп, и не уверен, что теперь делать. Заранее спасибо всем вам, ребята.

2 ответа

Решение

Добавьте обработчики к изображению перед строкой "new BitmapImage", например так:

this.Image.ImageOpened += ImageOpened;
this.Image.ImageFailed += ImageFailed;

Затем в событии ImageOpened сохраните его в WriteableBitmap:

private void ImageOpened(object sender, RoutedEventArgs e)
{
    WriteableBitmap wb = new WriteableBitmap((BitmapImage)sender);

        using (IsolatedStorageFile newIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            String tempJPEG = randomNumber.ToString();

            IsolatedStorageFileStream fileStream = newIsolatedStorage.CreateFile(tempJPEG);
            //fileStream.Close();
            //fileStream.Flush();
            BitmapImage image = new BitmapImage(new Uri("" + uri ));
            image.CreateOptions = BitmapCreateOptions.None;
            System.Windows.Media.Imaging.Extensions.SaveJpeg(wb, fileStream, wb.PixelWidth, wb.PixelHeight, 0, 85);
          }
}

В настоящее время вы пытаетесь сохранить изображение до его загрузки, отсюда исключение нулевого указателя.

Публикуйте это для всех, кто пытался загрузить несколько изображений в изолированное хранилище и сохранить имена файлов в WP. Обратите внимание, что для этого требуется URL-путь с именем файла из файла XML, который был загружен первым, удаляет путь, а затем сохраняет файл с исходным именем. Заимствовал какой-то код (Спасибо всем, особенно на philorube), написал другой и проклял МНОГО, чтобы попасть сюда, но это работает.

IsolatedStorageFile myIsolatedStorage =   IsolatedStorageFile.GetUserStoreForApplication();

        XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
        XDocument document =    XDocument.Load(myIsolatedStorage.OpenFile("Selections.xml", FileMode.Open));
        MyClass enclaves = (MyClass)serializer.Deserialize(document.CreateReader());


        foreach (var xe in document.Descendants("couplink"))
        {
            mane = xe.Value.ToString();
            WebClient webClient = new WebClient();
            Uri uri = new Uri(mane, UriKind.RelativeOrAbsolute);
            webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);
            webClient.OpenReadAsync((uri),mane);
        }
    }

    void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {
        int count;
        Stream stream = e.Result;
        byte[] buffer = new byte[1024];
        String imgName = (string)e.UserState;
        String cleanImgName = System.IO.Path.GetFileName(imgName);
        using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
        {
            using (System.IO.IsolatedStorage.IsolatedStorageFileStream isfs = new IsolatedStorageFileStream(cleanImgName, FileMode.Create, isf))
            {
                count = 0;
                while (0 < (count = stream.Read(buffer, 0, buffer.Length)))
                {
                    isfs.Write(buffer, 0, count);
                }
                stream.Close();
                isfs.Close();
            }
        }
Другие вопросы по тегам