2016-03-08 59 views
3

如何裁剪RenderTargetBitmap?相當於:UWP 10 RenderTargetBitmap在UWP中裁剪​​UIElement的區域10

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

這個問題似乎很簡單,但似乎沒有真正的做法。上面的語義概括了我的用例。我想渲染一個Xaml樹的部分。這是一個完全合法的用例。

保存到一個文件,這似乎是最常見的裁剪方式,真的不是一個好的答案。當然,也許有一天我會將裁剪後的圖像保存到我的媒體庫中,但不是今天。

回答

2

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 expret,有人更瞭解可能要改正這個代碼。

+0

我知道你採取了什麼樣的道路,因爲我經歷了完全相同的問題。我目前也依靠Win2D,但我認爲這非常黑客。感謝您花時間嘗試一下。 –