2012-01-16 23 views
7

Stavo seguendo l'articolo this e ho ottenuto la mia tela per essere salvata, tuttavia, voglio estendere la funzionalità del codice e salvare una parte particolare della mia tela come un'immagine, piuttosto che la mia intera tela .Salvare una tela WPF come immagine

Ho provato a impostare le proprietà rect.Offset e rect.Location ma l'immagine viene sempre salvata dall'angolo superiore sinistro della tela.

Qualcuno sa come posso ottenere la funzionalità desiderata in modo simile?

Grazie!

risposta

15

Un metodo semplice sarebbe quella di utilizzare un CroppedBitmap dopo il rendering tutta la tela. Puoi riutilizzare lo stesso RenderTargetBitmap se hai bisogno di più immagini.

RenderTargetBitmap rtb = new RenderTargetBitmap((int)canvas.RenderSize.Width, 
    (int)canvas.RenderSize.Height, 96d, 96d, System.Windows.Media.PixelFormats.Default); 
rtb.Render(canvas); 

var crop = new CroppedBitmap(rtb, new Int32Rect(50, 50, 250, 250)); 

BitmapEncoder pngEncoder = new PngBitmapEncoder(); 
pngEncoder.Frames.Add(BitmapFrame.Create(crop)); 

using(var fs = System.IO.File.OpenWrite("logo.png")) 
{ 
    pngEncoder.Save(fs); 
} 
+0

Fantastico! Questo sembra aver fatto il trucco! –

0

Verifica se questa soluzione è adatta a te.

Size size = new Size(width, height); 
canvas.Measure(size); 
canvas.Arrange(new Rect(X, Y, width, height)); 

//Save Image 
... 
... 

// Revert old position 
canvas.Measure(new Size()); 
+0

Questo non consente di ottenere ciò che l'OP ha richiesto poiché il problema è che le coordinate X, Y non possono essere specificate. Solo la larghezza e l'altezza desiderate. –

+0

Samuel ha ragione, sono in grado di modificare le dimensioni del rettangolo, tuttavia non posso posizionarlo altrove ma il punto di partenza predefinito nell'angolo in alto a sinistra ... –

+0

Cosa hai impostato come nuova dimensione? – MyKuLLSKI

0

Guardando il link che hai postato, ovviamente puoi scegliere qui le coordinate del bersaglio renderizzate.

RenderTargetBitmap rtb = new RenderTargetBitmap((int)rect.Right, 
    (int)rect.Bottom, 96d, 96d, System.Windows.Media.PixelFormats.Default); 
+0

Ciò non consente la specifica delle coordinate di partenza X e Y - solo la larghezza e l'altezza desiderate. –