0

我正在尝试将一些 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 创建): 这是渲染的结果

4

0 回答 0