将可视元素保存到文件中

时间:2015-07-07 23:13:45

标签: c# windows-phone-8.1

我试图以这种方式将框架元素保存到文件中:

async Task SaveVisualElementToFile(FrameworkElement element, StorageFile file)
{
    element.Width = element.ActualWidth;
    element.Height = element.ActualHeight;
    //string fileName = "customphoto.jpg";
    var renderTargetBitmap = new RenderTargetBitmap();
    await renderTargetBitmap.RenderAsync(element, (int)element.Width, (int)element.Height);
    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)element.Width, (uint)element.Height,
                             96,
                             96,
                             bytes);

        await encoder.FlushAsync();
    }
}

但结果并不像预期的那样。这是一个例子:

原始图片:

http://i.stack.imgur.com/z1xxd.png

已保存的图片:

http://i.stack.imgur.com/O7ZTU.jpg

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:1)

你的方法很好,只有像素因宽度/高度不正确而移位。您所要做的就是使用renderTargetBitmap.PixelHeight代替element.Height。有问题的代码应如下所示:

encoder.SetPixelData(BitmapPixelFormat.Bgra8,
                     BitmapAlphaMode.Ignore,
                     (uint)renderTargetBitmap.PixelWidth, 
                     (uint)renderTargetBitmap.PixelHeight,
                     96, 96, bytes);