2

I would like to save a photo selected with the PhotoChooserTask, but I am unsure of the proper method. So far, I have implemented the PhotoChooserTask_Completed method, but what is the proper method to save this to a bitmap?

EDIT: added basic implementation. The goal is to update a hubtile image to an image that the user selects from the PhotoChooserTask.

Note: I have placed the Settings class and TileItem class at the bottom for quick reference.

MainPage.xaml

string shareJPEG = "shareImage.jpg";
string linkJPEG = "linkImage.jpg";

BitmapImage shareImg;
BitmapImage linkImg;

public MainPage()
    {
        InitializeComponent();

        CreateHubTiles();

        photoChooserTask = new PhotoChooserTask();
        photoChooserTask.Completed += new EventHandler<PhotoResult>(photoChooserTask_Completed);
    }

public void CreateHubTiles()
    {     
        if (Settings.shareImageUpdated.Value == true)
        {
            //Settings.shareImage.Value = new BitmapImage();
            shareImg = new BitmapImage();

            using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
            {
                using (IsolatedStorageFileStream fileStream = myIsolatedStorage.OpenFile(shareJPEG, FileMode.Open, FileAccess.Read))
                {
                    //Settings.shareImage.Value.SetSource(fileStream);
                    shareImg.SetSource(fileStream);

                    //this.img.Height = bi.PixelHeight;
                    //this.img.Width = bi.PixelWidth;

                }
            }
            //this.img.Source = bi;
        }
        else
        {
            //Settings.shareImage.Value = new BitmapImage(new Uri("/Images/shareStatusImage.jpg", UriKind.Relative));
            shareImg = new BitmapImage(new Uri("/Images/shareStatusImage.jpg", UriKind.Relative));
        }

        if (Settings.linkImageUpdated.Value == true)
        {
            //Settings.linkImage.Value = new BitmapImage();
            linkImg = new BitmapImage();

            using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
            {
                using (IsolatedStorageFileStream fileStream = myIsolatedStorage.OpenFile(linkJPEG, FileMode.Open, FileAccess.Read))
                {
                    //Settings.linkImage.Value.SetSource(fileStream);
                    linkImg.SetSource(fileStream);

                    //this.img.Height = bi.PixelHeight;
                    //this.img.Width = bi.PixelWidth;

                }
            }
            //this.img.Source = bi;
        }
        else
        {
            //Settings.linkImage.Value = new BitmapImage(new Uri("/Images/shareStatusImage.jpg", UriKind.Relative));
            linkImg = new BitmapImage(new Uri("/Images/shareLinkImage.jpg", UriKind.Relative));
        }

        List<TileItem> tileItems = new List<TileItem>() 
        {                
            //new TileItem() { ImageUri = Settings.shareImage.Value, Title = "status", /*Notification = "last shared link uri",*/ Message = Settings.statusMessage.Value, GroupTag = "TileGroup", TileName = AppResource.Main_MainPage_HubTile_Status_Title },
            new TileItem() { ImageUri = shareImg, Title = "status", /*Notification = "last shared link uri",*/ Message = Settings.statusMessage.Value, GroupTag = "TileGroup", TileName = AppResource.Main_MainPage_HubTile_Status_Title },


            //new TileItem() { ImageUri = Settings.linkImage.Value, Title = "link", /*Notification = "last shared status message",*/ Message = Settings.linkUri.Value, GroupTag = "TileGroup", TileName = AppResource.Main_MainPage_HubTile_Link_Title },
            new TileItem() { ImageUri = linkImg, Title = "link", /*Notification = "last shared status message",*/ Message = Settings.linkUri.Value, GroupTag = "TileGroup", TileName = AppResource.Main_MainPage_HubTile_Link_Title },
        };

        this.tileList.ItemsSource = tileItems;
    }

public void changePictureMenuItem_Tap(object sender, System.Windows.Input.GestureEventArgs e)
    {
        var menuItem = (MenuItem)sender;
        tileItem = menuItem.DataContext as TileItem;  //for PhotoChooserTask_Completed              

        try
        {
            photoChooserTask.Show();
        }
        catch (System.InvalidOperationException ex)
        {
            //MessageBox.Show("An error occurred");
            MessageBox.Show(AppResource.Main_MainPage_ContextMenu_ChangePicture_Error_Message);
        }
    }

void photoChooserTask_Completed(object sender, PhotoResult e)
    {
        //Debug.WriteLine("***\t In photoChooserTask_Completed function of ChoosePhotoPage\t ***");

        if (e.TaskResult == TaskResult.OK)
        {
            //get the correct hubtile that was clicked and set image source to respective hubtile
            string tileTitle = tileItem.Title.ToString();

            switch (tileTitle)
            {
                case "status":

                    tileItem.ImageUri.SetSource(e.ChosenPhoto);  //sets the tile image immediately, but does not persist when the MainPage is navigated away


                    using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
                    {
                        if (myIsolatedStorage.FileExists(shareJPEG))
                        {
                            myIsolatedStorage.DeleteFile(shareJPEG);
                        }

                        IsolatedStorageFileStream fileStream = myIsolatedStorage.CreateFile(shareJPEG);

                        BitmapImage bitmap = new BitmapImage();
                        bitmap.SetSource(e.ChosenPhoto);
                        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();
                    }

                    Settings.shareImageUpdated.Value = true;  //simple boolean value that exists in isolated storage

                    break;
                case "link":
                    tileItem.ImageUri.SetSource(e.ChosenPhoto);  //sets the tile image immediately, but does not persist when the MainPage is navigated away

                    using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
                    {
                        if (myIsolatedStorage.FileExists(linkJPEG))
                        {
                            myIsolatedStorage.DeleteFile(linkJPEG);
                        }

                        IsolatedStorageFileStream fileStream = myIsolatedStorage.CreateFile(linkJPEG);

                        BitmapImage bitmap = new BitmapImage();
                        bitmap.SetSource(e.ChosenPhoto);
                        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();
                    } 

                    Settings.linkImageUpdated.Value = true;

                    break;
            }            
     }

The Settings and TileItem classes:

Settings.cs (uses key/value pairs to store data in isolated storage)

public static readonly Setting<BitmapImage> shareImage = new Setting<BitmapImage>("shareImage", new BitmapImage(new Uri("/Images/shareStatusImage.jpg", UriKind.Relative)));
public static readonly Setting<BitmapImage> linkImage = new Setting<BitmapImage>("linkImage", new BitmapImage(new Uri("/Images/shareLinkImage.jpg", UriKind.Relative)));

public static readonly Setting<bool> shareImageUpdated = new Setting<bool>("shareImageUpdated", false);
public static readonly Setting<bool> linkImageUpdated = new Setting<bool>("linkImageUpdated", false);

TileItem.cs

public class TileItem
{
    //public string ImageUri
    //{
    //    get;
    //    set;
    //}
    public BitmapImage ImageUri
    {
        get;
        set;
    }

    public string Title
    {
        get;
        set;
    }

    public string Notification
    {
        get;
        set;
    }

    public bool DisplayNotification
    {
        get
        {
            return !string.IsNullOrEmpty(this.Notification);
        }
    }

    public string Message
    {
        get;
        set;
    }

    public string GroupTag
    {
        get;
        set;
    }

    //for translation purposes (bound to HubTile Title on MainPage) 
    public string TileName
    {
        get;
        set;
    }
}

I do not get any debugging errors when running this application, but it seems thta the bitmaps are not being either saved or retrieved correctly, becuase the original tile image is the only one that persists when the app leaves the MainPage. What am I doing wrong here, and how may I fix this?

Matthew
  • 3,976
  • 15
  • 66
  • 130
  • Look like the previous question was cut http://stackoverflow.com/questions/12014318/how-to-copy-an-image-from-photochoosertask-to-a-bitmap – Oleg Aug 18 '12 at 07:40

1 Answers1

1

Here is the working code for storing image in Isolated storage and Loading it back. Check it.

string tempJPEG = "image.jpg";

    void photoTask_Completed(object sender, PhotoResult e)
    {
        using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            if (myIsolatedStorage.FileExists(tempJPEG))
            {
                myIsolatedStorage.DeleteFile(tempJPEG);
            }

            IsolatedStorageFileStream fileStream = myIsolatedStorage.CreateFile(tempJPEG);

            BitmapImage bitmap = new BitmapImage();
            bitmap.SetSource(e.ChosenPhoto);
            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();
        }
    }


//Code to load image from IsolatedStorage anywhere in your app
    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        BitmapImage bi = new BitmapImage();

        using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            using (IsolatedStorageFileStream fileStream = myIsolatedStorage.OpenFile(tempJPEG, FileMode.Open, FileAccess.Read))
            {
                bi.SetSource(fileStream);
                this.img.Height = bi.PixelHeight;
                this.img.Width = bi.PixelWidth;
            }
        }
        this.img.Source = bi;
    }
nkchandra
  • 5,585
  • 2
  • 30
  • 45
  • Your solution gave me some idea of how to correct my problem, but for some reason I could not get it to work correctly. The image was not updated? I edited my original question to show exactly what I have now, following your steps. Maybe you could spot something I have not to correct my error? – Matthew Aug 19 '12 at 01:32