Ошибка указателя нулевой ссылки на 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();
}
}