PhotoChooserTaskで選択した写真を保存したいのですが、正しい方法がわかりません。これまで、PhotoChooserTask_Completedメソッドを実装しましたが、これをビットマップに保存するための適切なメソッドは何ですか?
編集:基本的な実装を追加しました。目標は、ユーザーがPhotoChooserTaskから選択した画像にハビリ画像を更新することです。
注:クイックリファレンスとして、SettingsクラスとTileItemクラスを下部に配置しました。
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;
}
}
SettingsクラスとTileItemクラス:
Settings.cs(キーと値のペアを使用してデータを分離ストレージに保存します)
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;
}
}
このアプリケーションを実行してもデバッグエラーは発生しませんが、ビットマップが正しく保存または取得されていないようです。アプリがMainPageを離れたときに残るのは元のタイル画像だけだからです。私はここで何が間違っているのですか、そしてこれをどのように修正できますか?