MB.*_*MB. 5 xaml win-universal-app win2d
如何裁剪RenderTargetBitmap?相当于:
RenderTargetBitmap bmp = new RenderTargetBitmap();
await bmp.RenderAsync(element , cropRect );
Run Code Online (Sandbox Code Playgroud)
这个问题看起来很简单,但似乎没有真正的方法.以上语义总结了我的用例.我想渲染一个Xaml树的一部分.这是一个完全合法的用例.
保存到文件,这似乎是最常见的裁剪方式,真的不是一个好的答案.当然,也许有一天我会将裁剪的图像保存到我的媒体库中,但今天不行.
有BitmapTransform 和 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;
Run Code Online (Sandbox Code Playgroud)
请注意,我不是 Win2D 专家,更有知识的人可能想更正此代码。