【问题标题】:UWP 10 RenderTargetBitmap a cropped area of UIElement in UWP 10UWP 10 RenderTargetBitmap UWP 10 中 UIElement 的裁剪区域
【发布时间】:2016-03-08 04:24:44
【问题描述】:

如何裁剪 RenderTargetBitmap?相当于:

    RenderTargetBitmap bmp = new RenderTargetBitmap();
    await bmp.RenderAsync(element , cropRect );

这个问题看起来很简单,但似乎没有真正的方法。以上在语义上总结了我的用例。我想渲染 Xaml 树的 part。这是一个完全合法的用例。

保存到文件,这似乎是最常见的裁剪方式,确实不是一个好的答案。当然,也许有一天我会将裁剪的图像保存到我的媒体库中,但不是今天。

【问题讨论】:

    标签: xaml win-universal-app win2d


    【解决方案1】:

    BitmapTransform and BitmapDecoder 类,除其他功能外,您还可以裁剪图像。但我未能让它们与 RenderTargetBitmap 一起工作,每次尝试将像素数据从一个源传递到另一个源时都会遇到 HRESULT: 0x88982F50 异常。

    至于不同的方法,我可以考虑带上大炮并用Win2D 来实现它。这可能不是最方便的解决方案,但确实有效:

    var renderTargetBitmap = new RenderTargetBitmap();
    await renderTargetBitmap.RenderAsync(element, width, height);
    var pixels = await renderTargetBitmap.GetPixelsAsync();
    
    var currentDpi = DisplayInformation.GetForCurrentView().LogicalDpi;
    var device = CanvasDevice.GetSharedDevice();
    var imageSource = new CanvasImageSource(device, width, height, currentDpi);
    
    using (var drawingSession = imageSource.CreateDrawingSession(Colors.Transparent))
    using (var bitmap = CanvasBitmap.CreateFromBytes(
        drawingSession, pixels.ToArray(), width, height,
        DirectXPixelFormat.B8G8R8A8UIntNormalized, drawingSession.Dpi))
    {
        var cropEffect = new CropEffect
        {
            Source = bitmap,
            SourceRectangle = cropRect,
        };
    
        drawingSession.DrawImage(cropEffect);
    }
    
    ResultImage.Source = imageSource;
    

    请注意,我不是 Win2D 专家,更有知识的人可能想要更正此代码。

    【讨论】:

    • 我知道你走的是哪条路,因为我也遇到过完全相同的问题。我目前也依赖于 Win2D,但我认为这在很大程度上是一种 hack。不过,感谢您抽出时间试用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2018-01-31
    • 2016-02-21
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    相关资源
    最近更新 更多