我正在尝试将一些 UIElements 渲染到 RenderTargetBitmap。我有一个图像,它使用 TranslateTransform 在基本元素周围移动。当我使用 RenderTargetTransform.RenderAsync 时,图像是在没有转换的情况下呈现的。
我尝试改用 Margin,但 RenderTargetBitMap 也不遵守。
我可以让它真正使用那个变换吗?
这是代码,XAML 部分:
<Page
x:Class="W8RT_POC.RTBTransform"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:W8RT_POC"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="50" />
</Grid.RowDefinitions>
<Grid x:Name="RenderGrid" Grid.Row="0"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
<Image x:Name="RenderImage"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Source="Assets/Move_Normal.png" Stretch="Fill" RenderTransformOrigin="0.5,0.5" >
<Image.RenderTransform>
<CompositeTransform TranslateX="100" TranslateY="100"/>
</Image.RenderTransform>
</Image>
</Grid>
<Button x:Name="GoButton" Content="GO" Grid.Row="1"
HorizontalAlignment="Left" Click="GoButton_Click" />
</Grid>
</Page>
...以及背后的代码:
using System;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using System.Threading.Tasks;
using Windows.UI.Xaml.Media.Imaging;
namespace W8RT_POC
{
public sealed partial class RTBTransform : Page
{
public RTBTransform()
{
this.InitializeComponent();
}
private async void GoButton_Click(object sender, RoutedEventArgs e)
{
RenderTargetBitmap rtb = new RenderTargetBitmap();
// Fixed on Filip Skakun's comment. await rtb.RenderAsync(RenderGrid, (int)this.RenderGrid.Width, (int)this.RenderGrid.Height);
await rtb.RenderAsync(RenderGrid, (int)this.RenderGrid.ActualWidth, (int)this.RenderGrid.ActualHeight);
await SaveRenderTargetBitmap(rtb);
}
private async Task SaveRenderTargetBitmap(RenderTargetBitmap RtbToSave)
{
var picker = new Windows.Storage.Pickers.FileSavePicker();
picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.PicturesLibrary;
picker.FileTypeChoices.Add("GIF file", new string[] { ".gif" });
picker.DefaultFileExtension = ".gif";
picker.SuggestedFileName = "Illustration " + DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss");
Windows.Storage.StorageFile file = await picker.PickSaveFileAsync();
if (file != null)
{
Guid encoderId = Windows.Graphics.Imaging.BitmapEncoder.GifEncoderId;
var bitmapPropertySet = new Windows.Graphics.Imaging.BitmapPropertySet();
using (var writeStream = await file.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite))
{
var encoder = await Windows.Graphics.Imaging.BitmapEncoder.CreateAsync(encoderId, writeStream);
byte[] pixels = await GetPixels(RtbToSave);
encoder.SetPixelData(
Windows.Graphics.Imaging.BitmapPixelFormat.Bgra8,
Windows.Graphics.Imaging.BitmapAlphaMode.Premultiplied,
(uint)RtbToSave.PixelWidth,
(uint)RtbToSave.PixelHeight,
96,
96,
pixels);
await encoder.FlushAsync();
using (var outputStream = writeStream.GetOutputStreamAt(0))
{
await outputStream.FlushAsync();
}
} // using(writeStream)
} // if (file != null)
}
private static async Task<byte[]> GetPixels(RenderTargetBitmap bitmap)
{
// Get pixels from the RenderTargetBitmap. See http://social.technet.microsoft.com/wiki/contents/articles/20648.using-the-rendertargetbitmap-in-windows-store-apps-with-xaml-and-c.aspx
// Bytes are in BGRA8 format.
Windows.Storage.Streams.IBuffer pixelBuffer = await bitmap.GetPixelsAsync();
byte[] pixels = pixelBuffer.ToArray();
return pixels;
}
}
}
这就是我在屏幕上看到的内容(见左侧和顶部的黑色部分):
...这将转到保存的文件(由 RenderTargetBitMap.RenderAsync 创建):