我试图以这种方式将框架元素保存到文件中:
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();
}
}
但结果并不像预期的那样。这是一个例子:
原始图片:
已保存的图片:
我的代码出了什么问题?
答案 0 :(得分:1)
你的方法很好,只有像素因宽度/高度不正确而移位。您所要做的就是使用renderTargetBitmap.PixelHeight
代替element.Height
。有问题的代码应如下所示:
encoder.SetPixelData(BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Ignore,
(uint)renderTargetBitmap.PixelWidth,
(uint)renderTargetBitmap.PixelHeight,
96, 96, bytes);