2016-03-08 2 views
3

Comment recadrer un RenderTargetBitmap? L'équivalent de:UWP 10 RenderTargetBitmap une zone recadrée de UIElement dans UWP 10

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

Cette question semble assez simple, mais il semble qu'il n'y ait pas de véritable moyen de le faire. Ce qui précède résume sémantiquement mon cas d'utilisation. Je veux rendre partie d'un arbre Xaml. C'est un cas d'utilisation parfaitement légitime.

L'enregistrement dans un fichier, qui semble être le mode de recadrage le plus courant, n'est vraiment pas une bonne solution. Bien sûr, peut-être un jour je vais enregistrer une image recadrée dans ma bibliothèque multimédia, mais pas aujourd'hui.

Répondre

2

Il existe BitmapTransform and BitmapDecoder classes, qui parmi d'autres fonctions vous permettent de recadrer des images. Mais je n'ai pas réussi à les faire fonctionner avec RenderTargetBitmap, en se bumping chaque fois sur l'exception HRESULT: 0x88982F50 en essayant de passer des données de pixel d'une source à l'autre. En ce qui concerne l'approche différente, je peux envisager d'apporter des armes lourdes et de l'implémenter avec Win2D. Il pourrait ne pas être la solution la plus pratique, mais il fonctionne:

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; 

Notez que je ne suis pas Win2D expret et quelqu'un de plus compétent pourrait vouloir apporter des corrections à ce code.

+0

Je sais quel chemin vous avez pris, parce que j'ai traversé exactement les mêmes problèmes. Je compte actuellement sur Win2D, mais je pense que c'est vraiment un hack. Merci d'avoir pris le temps de l'essayer. –