Windows 8 - 将 XAML 中的图像另存为本地文件(在应用程序文件夹内)

本文关键字:文件 应用程序 文件夹 另存为 XAML 图像 Windows | 更新日期: 2023-09-27 17:58:39

在我的 Windows 应用商店应用程序中,我正在使用 XAML 中的图像控件显示图片。设置图像控件的源,使用可写位图进行代码明智。我正在尝试将此图像作为附件发送到电子邮件中。有什么简单的方法吗?我正在尝试在本地(在应用程序中(保存该图像并将保存的图像附加到电子邮件中。但无法在本地保存。任何帮助,不胜感激。

这是代码。

bitmap = await WriteableBitmapRenderExtensions.Render(dataCanvas(;
图像。源 = 位图;

dataCanvas 是一个 Canvas 控件,由两个图像组成,一个位置在另一个位置之上。实际上,我必须在用户脸部放置一个太阳镜,并将其显示为xaml中的另一个图像。还要通过电子邮件发送该图像。

Windows 8 - 将 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(都可以传递给BitmapEncoderBitmapEncoder采用写入编码的 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