Чтение и запись изображений в изолированное хранилище - PullRequest
3 голосов
/ 31 января 2012

Я сталкивался с несколькими различными способами записи изображений в изолированное хранилище на некоторых сайтах Windows Phone, однако я не уверен, какой из них лучше использовать для приложения камеры или есть некоторые, которые лучше других:

Первый из этого поста о базовом приложении камеры: http://msdn.microsoft.com/en-us/library/hh202956(v=VS.92).aspx Он берет JPEG из камеры и записывает его непосредственно в изолированное хранилище.

   void cam_CaptureImageAvailable(object sender, Microsoft.Devices.ContentReadyEventArgs e)
{
    string fileName = savedCounter + ".jpg";

    try
    {   // Write message to the UI thread.
        Deployment.Current.Dispatcher.BeginInvoke(delegate()
        {
            txtDebug.Text = "Captured image available, saving picture.";
        });

        // Save picture to the library camera roll.
        library.SavePictureToCameraRoll(fileName, e.ImageStream);

        // Write message to the UI thread.
        Deployment.Current.Dispatcher.BeginInvoke(delegate()
        {
            txtDebug.Text = "Picture has been saved to camera roll.";

        });

        // Set the position of the stream back to start
        e.ImageStream.Seek(0, SeekOrigin.Begin);

        // Save picture as JPEG to isolated storage.
        using (IsolatedStorageFile isStore = IsolatedStorageFile.GetUserStoreForApplication())
        {
            using (IsolatedStorageFileStream targetStream = isStore.OpenFile(fileName, FileMode.Create, FileAccess.Write))
            {
                // Initialize the buffer for 4KB disk pages.
                byte[] readBuffer = new byte[4096];
                int bytesRead = -1;

                // Copy the image to isolated storage. 
                while ((bytesRead = e.ImageStream.Read(readBuffer, 0, readBuffer.Length)) > 0)
                {
                    targetStream.Write(readBuffer, 0, bytesRead);
                }
            }
        }

        // Write message to the UI thread.
        Deployment.Current.Dispatcher.BeginInvoke(delegate()
        {
            txtDebug.Text = "Picture has been saved to isolated storage.";

        });
    }
    finally
    {
        // Close image stream
        e.ImageStream.Close();
    }

}

Кажется, что используется буфер 4 КБ, есть ли смысл делать это таким образом? Кажется немного сложнее, чем этот метод, который преобразует изображение в растровое изображение, а затем использует метод сохранения в формате Jpeg (http://www.windowsphonegeek.com/tips/All-about-WP7-Isolated-Storage---Read-and-Save-Images):

   // Create a filename for JPEG file in isolated storage.
        String tempJPEG = "logo.jpg";

        // Create virtual store and file stream. Check for duplicate tempJPEG files.
        using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            if (myIsolatedStorage.FileExists(tempJPEG))
            {
                myIsolatedStorage.DeleteFile(tempJPEG);
            }

            IsolatedStorageFileStream fileStream = myIsolatedStorage.CreateFile(tempJPEG);

            StreamResourceInfo sri = null;
            Uri uri = new Uri(tempJPEG, UriKind.Relative);
            sri = Application.GetResourceStream(uri);

            BitmapImage bitmap = new BitmapImage();
            bitmap.SetSource(sri.Stream);
            WriteableBitmap wb = new WriteableBitmap(bitmap);

            // Encode WriteableBitmap object to a JPEG stream.
            Extensions.SaveJpeg(wb, fileStream, wb.PixelWidth, wb.PixelHeight, 0, 85);

            //wb.SaveJpeg(fileStream, wb.PixelWidth, wb.PixelHeight, 0, 85);
            fileStream.Close();
        }

Если есть какие-то альтернативные методы, которые у вас есть, я также был бы заинтересован, спасибо!

1 Ответ

3 голосов
/ 31 января 2012

Думаю, вам стоит это проверить:

Я думаю, что я уже ответил на это и получил +50 вознаграждение

SO Сохранить изображение в изолированном хранилище с помощью байта []

...