c# - 如何使用 UWP 在图像上绘制文本并保存(适用于 Windows 10)

标签 c# uwp draw

我想在 UWP(适用于 Windows 10)中的模板图像上绘制文本,然后能够保存图像(以便用户可以打印或共享它)。

我玩过 Canvas 控件,甚至玩过 nuget 的 Win2D 包。任何有关执行此操作的最佳方法的建议都将受到赞赏。下面是我离开的地方的示例代码。

XAML

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

<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Button Name="btnSaveImage" Content="Save the image" Margin="10" Click="btnSaveImage_Click" />

    <Grid Name="MyCreatedImage">
        <Image Name="imgName" Stretch="UniformToFill" Source="Assets/HelloMyNameIs.jpg" />
        <TextBlock Name="lblName" Text="McFly" Margin="20,100,20,20" FontSize="36"/>
    </Grid>
</StackPanel>

代码隐藏

using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;

namespace DrawTextExample {
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        private async void btnSaveImage_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e) {
            var bitmap = new RenderTargetBitmap();
            await bitmap.RenderAsync(MyCreatedImage);
        }
    }
}

图片 (HelloMyNameIs.jpg) Hello my name is

最佳答案

I want to draw text on a template image in UWP (for Windows 10), and then be able to save the image (so the user could print or share it).

根据您的代码片段,您正在尝试使用 RenderTargetBitmap可以满足您的要求。此类可以将 ImageTextBlock 一起呈现为一个图像。您的代码片段只是缺乏保存。您可以按如下方式保存渲染图像:

private async void btnSaveImage_Click(object sender, RoutedEventArgs e)
{
    RenderTargetBitmap bitmap = new RenderTargetBitmap();
    await bitmap.RenderAsync(MyCreatedImage);

    var pixelBuffer = await bitmap.GetPixelsAsync();
    var pixels = pixelBuffer.ToArray();
    var displayInformation = DisplayInformation.GetForCurrentView();
    StorageFolder pictureFolder = KnownFolders.SavedPictures;
    var file = await pictureFolder.CreateFileAsync("test2.jpg", CreationCollisionOption.ReplaceExisting);
    using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
    {
        var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
        encoder.SetPixelData(BitmapPixelFormat.Bgra8,
                             BitmapAlphaMode.Premultiplied,
                             (uint)bitmap.PixelWidth,
                             (uint)bitmap.PixelHeight,
                             displayInformation.RawDpiX,
                             displayInformation.RawDpiY,
                             pixels);
        await encoder.FlushAsync();
    }
}

您也可以尝试使用 Win2D这可能会被推荐。您可以根据需要绘制图像、文本和形状。它提供了 CanvasBitmap.SaveAsync保存结果的方法。例如,下面的演示演示了如何在图像上绘制文本并将其保存到图片文件夹中。

Uri imageuri = new Uri("ms-appx:///Assets/HelloMyNameIs.jpg");
StorageFile inputFile = await StorageFile.GetFileFromApplicationUriAsync(imageuri);
BitmapDecoder imagedecoder;
using (var imagestream = await inputFile.OpenAsync(FileAccessMode.Read))
{
    imagedecoder =await BitmapDecoder.CreateAsync(imagestream);
}  
CanvasDevice device = CanvasDevice.GetSharedDevice();
CanvasRenderTarget renderTarget = new CanvasRenderTarget(device, imagedecoder.PixelWidth, imagedecoder.PixelHeight, 96);
using (var ds = renderTarget.CreateDrawingSession())
{
    ds.Clear(Colors.White);
    CanvasBitmap image = await CanvasBitmap.LoadAsync(device, inputFile.Path, 96);
    ds.DrawImage(image);
    ds.DrawText(lblName.Text, new System.Numerics.Vector2(150, 150), Colors.Black);
}
string filename = "test1.png";
StorageFolder pictureFolder = KnownFolders.SavedPictures;
var file = await pictureFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
    await renderTarget.SaveAsync(fileStream, CanvasBitmapFileFormat.Png, 1f);
}

如果你想在图像上绘制个性文字,你可以考虑使用 InkCanvas to DrawInk .详情可引用this thread .

关于c# - 如何使用 UWP 在图像上绘制文本并保存(适用于 Windows 10),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46326260/

相关文章:

c# - UWP CreateFileAsync 线程在 Release模式下编译并选中 Compile with .NET Native 工具链时退出

c# - 防止用户输入的数据在新窗口加载时被清除

javascript - 绘制带三 Angular 形的圆 WebGL

c++ - 是否可以将 Windows 位图绘制到 cairo 表面?

javascript - 在调整 Fabric.js 中基于文本的对象大小时,如何防止包含文本的垂直和水平拉伸(stretch)?

c# - 关于 ViewModel 和 View 交互

c# - 让 C# 为已解析的 ISO 8601 字符串正确设置 Kind 属性

c# - 如何根据特定字段的出现获取数据库中的前 5 项?

c# - 如何自动将生成的源文件包含到 Visual Studio 中的 C# 项目中?

c# - 在后面的代码中将 Text 设置为 RichTextBlock