gpt4 book ai didi

c# - 如何从 PhotoChooserTask 保存图片

转载 作者:太空宇宙 更新时间:2023-11-03 13:56:29 24 4
gpt4 key购买 nike

我想保存一张用 PhotoChooserTask 选择的照片,但我不确定正确的方法。到目前为止,我已经实现了 PhotoChooserTask_Completed 方法,但是将其保存到位图的正确方法是什么?

编辑:添加了基本实现。目标是将 hubtile 图像更新为用户从 PhotoChooserTask 中选择的图像。

注意:我已将 Settings 类和 TileItem 类放在底部以供快速引用。

主页.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;
}
}

运行此应用程序时我没有收到任何调试错误,但似乎位图没有被正确保存或检索,因为原始图 block 图像是应用程序离开 MainPage 时唯一持续存在的图像。我在这里做错了什么,我该如何解决?

最佳答案

这是将图像存储在隔离存储中并将其加载回的工作代码。检查一下。

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;
}

关于c# - 如何从 PhotoChooserTask 保存图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12016545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com