c# - 将 Windows 应用商店应用程序中的 Canvas 保存为图像文件

标签 c# canvas windows-store-apps visual-studio-2013

我正在寻找从 Windows 应用商店应用程序中保存 Canvas 的方法,我找到了:

private void CreateSaveBitmap(Canvas canvas, string filename)
     {
       RenderTargetBitmap renderBitmap = new RenderTargetBitmap(
        (int)canvas.Width, (int)canvas.Height,
        96d, 96d, PixelFormats.Pbgra32);
      // needed otherwise the image output is black
       canvas.Measure(new Size((int)canvas.Width, (int)canvas.Height));
       canvas.Arrange(new Rect(new Size((int)canvas.Width, (int)canvas.Height)));

renderBitmap.Render(canvas);

//JpegBitmapEncoder encoder = new JpegBitmapEncoder();
       PngBitmapEncoder encoder = new PngBitmapEncoder();
       encoder.Frames.Add(BitmapFrame.Create(renderBitmap));

using (FileStream file = File.Create(filename))
       {
         encoder.Save(file);
       }
     }

但该方法在 Windows 应用商店应用程序中不起作用(RenderTargetBitmap 没有 5 参数构造函数,没有 PngBitmapEncoder)。所以我的问题是如何从 Windows 应用商店应用程序中将 Canvas 保存为某种图像文件(jpg、png 等),有什么办法可以做到这一点吗?

最佳答案

试试这个

using System.Runtime.InteropServices.WindowsRuntime

private async Task CreateSaveBitmapAsync(Canvas canvas)
{
    if (canvas != null)
    {
        RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
        await renderTargetBitmap.RenderAsync(canvas);

        var picker = new FileSavePicker();
        picker.FileTypeChoices.Add("JPEG Image", new string[] { ".jpg" });
        StorageFile file = await picker.PickSaveFileAsync();
        if (file != null)
        {
            var pixels = await renderTargetBitmap.GetPixelsAsync();

            using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
            {
                var encoder = await
                    BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
                byte[] bytes = pixels.ToArray();
                encoder.SetPixelData(BitmapPixelFormat.Bgra8,
                                     BitmapAlphaMode.Ignore,
                                     (uint)canvas.Width, (uint)canvas.Height,
                                     96, 96, bytes);

                await encoder.FlushAsync();
            }
        } 
    }
}

关于c# - 将 Windows 应用商店应用程序中的 Canvas 保存为图像文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22313245/

相关文章:

c# - .NET 字节而不是字符的正则表达式

c# - 如果不存在,如何创建 c# app.config 文件?

javascript - 应用图像过滤器加载 fabric.image 的 fabric js 子类

javascript - 有没有办法导出 PowerPoint?

javascript - Android 浏览器在 "double swipe"滚动后停止渲染 Canvas

c# - 在 Windows 8 商店 C# 应用程序 : The base class or interface could not be resolved 中使用 WSDL Web 服务

xaml - UWP 应用程序的 XAML 中具有RelativePanel 的 UI 元素的相对宽度

c# - 初始化查找<int, string>

c# - HRESULT 异常 : 0xC00D36B4

java - 对函数的澄清 - 它是一种属性、特殊代码、过程/例程的另一种说法还是有多个定义?