Как сохранить растровое изображение в изолированном хранилище?

Я разрабатываю веб-часть Silverlight, используя клиентскую объектную модель. Я получаю растровое изображение с сервера sharepoint. Теперь я хочу сохранить это растровое изображение в изолированном хранилище. Итак, я использую следующий код

 WriteableBitmap wb = new WriteableBitmap(attachments);

 using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication())
 {
     using (IsolatedStorageFileStream isoStream =
     new IsolatedStorageFileStream("abcd1.jpg", FileMode.Create, isoFile))
     {
         using (StreamWriter sw = new StreamWriter(isoStream))
         {
             sw.Write(wb.ToByteArray());
         }
     }
 }

Теперь я вижу сохраненное изображение в папке C: \ Users \ Rent2 \ AppData \ LocalLow \ Microsoft \ Silverlight \ is \ vzvpufsm.s4i \ m0laonzr.til \ 1 \ s \ nkhajster01es5wdoyfxd0n5rd2dls3ovyu4wcdig04zjx44hyaaafea

Когда я нажимаю на нее, появляется сообщение «Неверное изображение». Подскажите, пожалуйста, как мне написать код, чтобы я мог видеть реальное изображение после сохранения его в изолированном хранилище?


person Shailesh Jaiswal    schedule 01.12.2011    source источник


Ответы (3)


Я могу придумать здесь два жизнеспособных варианта.

  1. В приведенном выше коде сохраните массив Pixels файла WriteableBitmap. Затем, чтобы восстановить его, вы должны создать WriteableBitmap подходящего размера и установить массив Pixels для сохраненных данных.

-or-

  1. Используйте запрос HttpWebRequest или WebClient, чтобы получить поток необработанного изображения и сохранить его в IsolatedStorage.

У каждого из них есть свои плюсы и минусы: в первом случае данные несжаты и будут занимать больше места в изолированном хранилище, и вы не сможете открыть изображение с диска за пределами Silverlight, аналогично проблеме, которая возникла у вас выше. . Для второго варианта вы можете столкнуться с проблемами междоменного доступа, если изображения находятся на другом сервере, чем ваш XAP-файл Silverlight, и его также немного сложнее реализовать.

person Bill Reiss    schedule 01.12.2011
comment
Не могли бы вы предоставить код для первого из предложенных вами? Это мне очень поможет - person Shailesh Jaiswal; 01.12.2011
comment
Здесь есть образец: csharperimage.jeremylikness. com / 2009/07 / похоже, что у вас все еще будут проблемы с междоменным доступом к массиву пикселей WriteableBitmap, который загружен кросс-доменом, поэтому я бы, вероятно, выбрал второй вариант, поскольку он будет меньше на диске, и с ним будет легче работать. - person Bill Reiss; 02.12.2011

Основная проблема заключается в том, что вы сохраняете декодированный массив пикселей RGBA как файл JPEG, но это не то же самое. Ваш код в основном правильный: вы просто не можете использовать этот метод для сохранения его в виде файла JPEG. Но если вы знаете, что изображение, скажем, 800x600, вы можете создать WriteableBitmap 800x600, а затем установить свойство Pixels на массив байтов извлеченного потока. Или, если вы не знаете размеры, когда вы его извлекаете, вы можете сохранить размеры как первые два целых числа в потоке (перед записью пикселей в поток) и считывать размеры при чтении файл. Фактически вы создадите свой собственный очень упрощенный формат .bmp.

person Ken Smith    schedule 01.12.2011

person    schedule
comment
Добавьте в свой проект dll ICSharpCode.SharpZipLib.Silverlight - person Shailesh Jaiswal; 02.07.2012