首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在UWP油墨画布上显示背景图像

在UWP油墨画布上显示背景图像
EN

Stack Overflow用户
提问于 2016-05-12 07:15:02
回答 1查看 5.9K关注 0票数 8

我在我的UWP应用程序中有一个InkCanvas,并且希望显示一个图像(理想情况下,作为画布的一部分,但否则,以某种方式覆盖它(想法是我可以将更改的图像保存回图像文件)。WPF似乎允许InkCanvas有孩子,但在UWP中,这似乎是不可能的。我试过以下几种方法:

代码语言:javascript
复制
        <InkCanvas x:Name="drawInkCanvas">
            <Image Source="{Binding DrawingImage}"/>

        </InkCanvas>

但这是行不通的,我也试过这样做:

代码语言:javascript
复制
        <Grid Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2">
            <InkCanvas x:Name="drawInkCanvas" Opacity=".5"/>
            <Image Source="{Binding DrawingImage}" Opacity=".5"/>

        </Canvas>

公平地说,我对此并没有很高的期望;不管怎样,尽管它确实很有用,但它使图像和InkCanvas看起来都不对,而且显然,也不允许我保存最终的图像。

理想情况下,应该有一个背景图像或类似的东西。有什么可以用来实现这一点的吗?我正在接近这样的观点:我可能必须用标准画布替换InkCanvas,然后重写所有InkCanvas功能!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-08 09:34:53

所以你有几个问题

  1. 如何在InkCanvas控件上使用Image绘制。
  2. 如何将结果保存到文件中。

在本例中,我将使用简单的UWP应用程序,它假定您的资产文件夹中有"sample.jpg“文件,清单中有”图片库“功能。

要解决第一个问题,只需将InkCanvasImage放在同一个容器中(如Grid),但请记住,order关系到

代码语言:javascript
复制
<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid>
        <Image Source="/Assets/sample.jpg"></Image>
        <InkCanvas x:Name="ink"></InkCanvas>
    </Grid>
    <Button Content="Save"
            Width="100"
            Height="25"
            HorizontalAlignment="Center"
            VerticalAlignment="Center" Click="BtnSave_Click"/>
</StackPanel>

如果您将InkCanvas放在第一位(就像您在问题示例中所做的那样)--它将不起作用。然而,如果把InkCanvas最后-所有工作良好,你可以画你的形象。

为了解决第二个问题,您需要使用Win2D (安装nuget Win2D.uwp包),因为标准RenderTargetBitmap不会呈现InkCanvas内容。首先绘制您的原始图像(直接从原始源获取图像,例如从原始文件中获取图像),然后在其上绘制您的墨水画布的内容。MainPage的完整代码(如果在上面添加xaml,您将获得完整的工作示例):

代码语言:javascript
复制
public sealed partial class MainPage : Page {
    public MainPage() {
        this.InitializeComponent();
        // just set some properties of ink canvas, not directly relevant to your question
        ink.InkPresenter.InputDeviceTypes = CoreInputDeviceTypes.Mouse | CoreInputDeviceTypes.Touch;
        var attr = new InkDrawingAttributes();
        attr.Color = Colors.Red;
        attr.IgnorePressure = true;
        attr.PenTip = PenTipShape.Circle;
        attr.Size = new Size(4, 10);
        ink.InkPresenter.UpdateDefaultDrawingAttributes(attr);
    }

    private async void BtnSave_Click(object sender, RoutedEventArgs e) {
        // grab output file
        StorageFolder storageFolder = KnownFolders.SavedPictures;
        var file = await storageFolder.CreateFileAsync("output.jpg", CreationCollisionOption.ReplaceExisting);

        CanvasDevice device = CanvasDevice.GetSharedDevice();
        CanvasRenderTarget renderTarget = new CanvasRenderTarget(device, (int) ink.ActualWidth, (int) ink.ActualHeight, 96);

        // grab your input file from Assets folder
        StorageFolder appInstalledFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;
        StorageFolder assets = await appInstalledFolder.GetFolderAsync("Assets");
        var inputFile = await assets.GetFileAsync("sample.jpg");            
        using (var ds = renderTarget.CreateDrawingSession()) {
            ds.Clear(Colors.White);                
            var image = await CanvasBitmap.LoadAsync(device, inputFile.Path);
            // draw your image first
            ds.DrawImage(image);
            // then draw contents of your ink canvas over it
            ds.DrawInk(ink.InkPresenter.StrokeContainer.GetStrokes());
        }

        // save results
        using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite)) {
            await renderTarget.SaveAsync(fileStream, CanvasBitmapFileFormat.Jpeg, 1f);
        }
    }
}
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37179815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档