RenderTargetBitmap重影问题,在循环中呈现表情-UWP

RenderTargetBitmap重影问题,在循环中呈现表情-UWP,uwp,emoji,Uwp,Emoji,在循环中,随后的PNG也微弱地显示先前的PNG 有两个按钮,一个用于在循环中呈现多个表情,另一个用于单独执行。单独完成后,表情会按预期呈现 using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices.WindowsRuntime; using System.Threading.Tasks; using Windows.Foundation; usi

在循环中,随后的PNG也微弱地显示先前的PNG

有两个按钮,一个用于在循环中呈现多个表情,另一个用于单独执行。单独完成后,表情会按预期呈现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Threading.Tasks;
using Windows.Foundation;
using Windows.Graphics.Display;
using Windows.Graphics.Imaging;
using Windows.Storage;
using Windows.Storage.Pickers;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;

namespace RenderTargetBitmapLoopIssue
{

public sealed partial class MainPage : Page
{
    private List<EmojiDetail> emojiDetails;
    private int individualCounter = 0;
    public MainPage()
    {
        this.InitializeComponent();
        var texts = new string[] { "0023_fe0f_20e3", "002a_fe0f_20e3", "0030_fe0f_20e3", "0031_fe0f_20e3", "0032_fe0f_20e3", "0033_fe0f_20e3", "0034_fe0f_20e3", "0035_fe0f_20e3", "0036_fe0f_20e3", "0037_fe0f_20e3", "0038_fe0f_20e3", "0039_fe0f_20e3" };
        emojiDetails = texts.Select(t => new EmojiDetail { FileName = t, EmojiSequence = GetText(t) }).ToList();
    }
    private string GetText(string emoji)
    {
        var parts = emoji.Split(new string[] { "_" }, StringSplitOptions.None);
        var text = "";
        foreach (var part in parts)
        {
            text += HexToTextString(part);
        }
        return text;
    }
    private string HexToTextString(string hex)
    {
        int value = int.Parse(hex, System.Globalization.NumberStyles.HexNumber);
        return char.ConvertFromUtf32(value).ToString();
    }

    private  IAsyncOperation<StorageFolder> GetStorageFolder()
    {
        var folderPicker = new FolderPicker();
        folderPicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
        folderPicker.FileTypeFilter.Add("*");
        return folderPicker.PickSingleFolderAsync();
    }
    private async void Button_RenderInLoop(object sender, RoutedEventArgs e)
    {
        var folder = await GetStorageFolder();

        foreach (var em in emojiDetails)
        {
            await Render(folder, em.FileName, em.EmojiSequence);
        }
    }
    private async Task Render(StorageFolder folder,string fileName,string emojiSequence)
    {
        renderedControl.Text = emojiSequence;
        var saveFile = await folder.CreateFileAsync(fileName+".png", CreationCollisionOption.ReplaceExisting);
        RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
        await renderTargetBitmap.RenderAsync(renderedControl);
        var pixelBuffer = await renderTargetBitmap.GetPixelsAsync();
        // Encode the image to the selected file on disk 
        using (var fileStream = await saveFile.OpenAsync(FileAccessMode.ReadWrite))
        {
            var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, fileStream);

            encoder.SetPixelData(
                BitmapPixelFormat.Bgra8,
                BitmapAlphaMode.Straight,
                (uint)renderTargetBitmap.PixelWidth,
                (uint)renderTargetBitmap.PixelHeight,
                DisplayInformation.GetForCurrentView().LogicalDpi,
                DisplayInformation.GetForCurrentView().LogicalDpi,
                pixelBuffer.ToArray());

            await encoder.FlushAsync();
        }
    }
    private async void Button_RenderIndividually(object sender, RoutedEventArgs e)
    {
        var folder = await GetStorageFolder();
        var emoji = emojiDetails[individualCounter];
        await Render(folder, emoji.FileName + "_individual", emoji.EmojiSequence);
        individualCounter++;
    }
}
class EmojiDetail
{
    public string FileName { get; set; }
    public string EmojiSequence { get; set; }
}
}

<Page
x:Class="RenderTargetBitmapLoopIssue.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:RenderTargetBitmapLoopIssue"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">

<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <TextBox FontSize="72" HorizontalAlignment="Left" x:Name="renderedControl"></TextBox>
    <Button Click="Button_RenderInLoop">Render in loop</Button>
    <Button Click="Button_RenderIndividually">Render individually</Button>
</StackPanel>
</Page>
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Runtime.InteropServices.WindowsRuntime;
使用System.Threading.Tasks;
使用Windows基金会;
使用Windows.Graphics.Display;
使用Windows.Graphics.Imaging;
使用Windows.Storage;
使用Windows.Storage.Pickers;
使用Windows.UI.Xaml;
使用Windows.UI.Xaml.Controls;
使用Windows.UI.Xaml.Media.Imaging;
命名空间RenderTargetBitmapLoopIssue
{
公共密封部分类主页面:第页
{
私人名单详情;
私有int individualCounter=0;
公共主页()
{
this.InitializeComponent();
变量文本=新字符串[]{“0023_fe0f_20e3”,“002a_fe0f_20e3”,“0030_fe0f_20e3”,“0031_fe0f_20e3”,“0032_fe0f_20e3”,“0033_fe0f_20e3”,“0034_fe0f_20e3”,“0035_fe0f_20e3”,“0036_fe0f_20e3”,“0037_fe0f_20e3”,“0038_fe0; e3”,“0039”;
emojiDetails=text.Select(t=>newemojidetails{FileName=t,EmojiSequence=GetText(t)}).ToList();
}
私有字符串GetText(字符串表情符号)
{
var parts=emoji.Split(新字符串[]{“{”},StringSplitOptions.None);
var text=“”;
foreach(var零件中的零件)
{
text+=HexToTextString(部分);
}
返回文本;
}
私有字符串HexToTextString(字符串十六进制)
{
int value=int.Parse(十六进制,System.Globalization.NumberStyles.HexNumber);
返回char.ConvertFromUtf32(value.ToString();
}
私有IAsyncOperation GetStorageFolder()
{
var folderPicker=new folderPicker();
folderPicker.SuggestedStartLocation=PickerLocationId.DocumentsLibrary;
folderPicker.FileTypeFilter.Add(“*”);
返回folderPicker.PickSingleFolderAsync();
}
私有异步无效按钮\u RenderInLoop(对象发送方,路由目标)
{
var folder=等待GetStorageFolder();
foreach(emojiDetails中的var em)
{
等待渲染(文件夹,em.FileName,em.EmojiSequence);
}
}
专用异步任务呈现(StorageFolder文件夹、字符串文件名、字符串emojiSequence)
{
renderedControl.Text=emojiSequence;
var saveFile=await folder.CreateFileAsync(fileName+“.png”,CreationCollisionOption.ReplaceExisting);
RenderTargetBitmap RenderTargetBitmap=新建RenderTargetBitmap();
等待renderTargetBitmap.RenderAsync(RenderControl);
var pixelBuffer=await renderTargetBitmap.GetPixelsAsync();
//将图像编码到磁盘上的选定文件
使用(var fileStream=await saveFile.OpenAsync(FileAccessMode.ReadWrite))
{
var encoder=await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId,fileStream);
编码器.SetPixelData(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode。笔直,
(uint)renderTargetBitmap.PixelWidth,
(uint)renderTargetBitmap.PixelHeight,
DisplayInformation.GetForCurrentView().LogicalDpi,
DisplayInformation.GetForCurrentView().LogicalDpi,
pixelBuffer.ToArray());
等待编码器。FlushAsync();
}
}
私有异步无效按钮\u单独呈现(对象发送方、路由目标方)
{
var folder=等待GetStorageFolder();
var emoji=emojiDetails[individualCounter];
等待渲染(文件夹,emoji.FileName+“_个人”,emoji.EmojiSequence);
个人计数器++;
}
}
类EmojiDetail
{
公共字符串文件名{get;set;}
公共字符串EmojiSequence{get;set;}
}
}
循环渲染
单独呈现
请告知


非常感谢Tony。

您可以为TextBox设置
Background=“White”
,以解决此问题。@XavierXie MSFT它确实有效,但在本用例的条件下不起作用。我需要渲染alpha通道。您可以为TextBox设置
Background=“White”
,以解决此问题。@XavierXie MSFT它确实有效,但在本用例的条件下不起作用。我需要渲染alpha通道。