Windows 8 - 将 XAML 中的图像另存为本地文件(在应用程序文件夹内)
本文关键字:文件 应用程序 文件夹 另存为 XAML 图像 Windows | 更新日期: 2023-09-27 17:58:39
在我的 Windows 应用商店应用程序中,我正在使用 XAML 中的图像控件显示图片。设置图像控件的源,使用可写位图进行代码明智。我正在尝试将此图像作为附件发送到电子邮件中。有什么简单的方法吗?我正在尝试在本地(在应用程序中(保存该图像并将保存的图像附加到电子邮件中。但无法在本地保存。任何帮助,不胜感激。
这是代码。
bitmap = await WriteableBitmapRenderExtensions.Render(dataCanvas(;
图像。源 = 位图;
dataCanvas 是一个 Canvas 控件,由两个图像组成,一个位置在另一个位置之上。实际上,我必须在用户脸部放置一个太阳镜,并将其显示为xaml中的另一个图像。还要通过电子邮件发送该图像。
查看 WinRT XAML 工具包中的WriteableBitmapSaveExtensions
类,了解可用于保存WriteableBitmap
的所有SaveToFile()
扩展方法。
核心是这样的:
public static async Task SaveToFile(
this WriteableBitmap writeableBitmap,
StorageFile outputFile,
Guid encoderId)
{
Stream stream = writeableBitmap.PixelBuffer.AsStream();
byte[] pixels = new byte[(uint)stream.Length];
await stream.ReadAsync(pixels, 0, pixels.Length);
using (var writeStream = await outputFile.OpenAsync(FileAccessMode.ReadWrite))
{
var encoder = await BitmapEncoder.CreateAsync(encoderId, writeStream);
encoder.SetPixelData(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Premultiplied,
(uint)writeableBitmap.PixelWidth,
(uint)writeableBitmap.PixelHeight,
96,
96,
pixels);
await encoder.FlushAsync();
using (var outputStream = writeStream.GetOutputStreamAt(0))
{
await outputStream.FlushAsync();
}
}
}
可以使用该方法的重载获取编码器 ID:
public static async Task<StorageFile> SaveToFile(
this WriteableBitmap writeableBitmap,
StorageFolder storageFolder,
string fileName,
CreationCollisionOption options = CreationCollisionOption.ReplaceExisting)
{
StorageFile outputFile =
await storageFolder.CreateFileAsync(
fileName,
options);
Guid encoderId;
var ext = Path.GetExtension(fileName);
if (new[] { ".bmp", ".dib" }.Contains(ext))
{
encoderId = BitmapEncoder.BmpEncoderId;
}
else if (new[] { ".tiff", ".tif" }.Contains(ext))
{
encoderId = BitmapEncoder.TiffEncoderId;
}
else if (new[] { ".gif" }.Contains(ext))
{
encoderId = BitmapEncoder.GifEncoderId;
}
else if (new[] { ".jpg", ".jpeg", ".jpe", ".jfif", ".jif" }.Contains(ext))
{
encoderId = BitmapEncoder.JpegEncoderId;
}
else if (new[] { ".hdp", ".jxr", ".wdp" }.Contains(ext))
{
encoderId = BitmapEncoder.JpegXREncoderId;
}
else //if (new [] {".png"}.Contains(ext))
{
encoderId = BitmapEncoder.PngEncoderId;
}
await writeableBitmap.SaveToFile(outputFile, encoderId);
return outputFile;
}
BitmapSource
的任何子类(包括WritableBitmap
(都可以传递给BitmapEncoder
。 BitmapEncoder
采用写入编码的 JPEG、PNG 或其他图像的Stream
。
然后,可以使用邮件程序库引用编码器使用的流,或使用"共享"合约,并直接传递流。
例:
var bitmap = new WritableBitmap();
// ... draw your bitmap
var tempPath = // path to where you want to save (probably in your appx temp);
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(bitmap);
using (var fs = new FileStream(tempPath))
{
encoder.Save(fs);
}
// use the image saved to tempPath
// http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh871370.aspx