2012-01-16 17 views
7

Podążałem za artykułem this, a moje płótno zostało zapisane, jednak chcę rozszerzyć funkcjonalność kodu i zapisać część obrazu jako obraz, a nie całe płótno .Zapisywanie płótna WPF jako obrazu

Próbowałem ustawić właściwości rect.Offset i rect.Location, ale obraz jest zawsze zapisywany w lewym górnym rogu obszaru roboczego.

Czy ktoś wie, w jaki sposób mogę osiągnąć pożądaną funkcjonalność w podobny sposób?

Dzięki!

Odpowiedz

15

Prostą metodą byłoby użycie CroppedBitmap po renderowaniu całego płótna. Możesz użyć tej samej RenderTargetBitmap, jeśli potrzebujesz wielu obrazów.

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

Awesome! Wydaje się, że to się udało! –

0

Sprawdź, czy to rozwiązanie działa dla Ciebie.

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

Nie osiągnie to, czego żądany PO jest problemem, ponieważ nie można podać współrzędnych X, Y. Tylko pożądana szerokość i wysokość. –

+0

Samuel ma rację, jestem w stanie zmienić rozmiar prostokąta, ale nie mogę ustawić go nigdzie indziej poza domyślnym punktem początkowym lewego górnego rogu ... –

+0

Co ustawiłeś jako swój nowy rozmiar? – MyKuLLSKI

0

Patrząc na opublikowany link, oczywiście można tutaj wybrać renderowane współrzędne celu.

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

To nie pozwala na podanie współrzędnych początkowych X i Y - tylko żądaną szerokość i wysokość. –