2011-05-03 11 views
9

Próbuję skopiować część BitmapSource do WritableBitmap.Kopiowanie z BitmapSource do WritableBitmap

To jest mój kod do tej pory:

var bmp = image.Source as BitmapSource; 
var row = new WriteableBitmap(bmp.PixelWidth, bottom - top, bmp.DpiX, bmp.DpiY, bmp.Format, bmp.Palette); 
row.Lock(); 
bmp.CopyPixels(new Int32Rect(top, 0, bmp.PixelWidth, bottom - top), row.BackBuffer, row.PixelHeight * row.BackBufferStride, row.BackBufferStride); 
row.AddDirtyRect(new Int32Rect(0, 0, row.PixelWidth, row.PixelHeight)); 
row.Unlock(); 

otrzymuję „ArgumentException: Wartość nie mieści się w oczekiwanym zakresie.” w linii CopyPixels.

Próbowałem zamieniać row.PixelHeight * row.BackBufferStride z row.PixelHeight * row.PixelWidth, ale potem pojawia się błąd informujący, że wartość jest zbyt niska.

Nie mogłem znaleźć jednego przykładu kodu, używając tego przeciążenia z CopyPixels, więc proszę o pomoc.

Dzięki!

Odpowiedz

19

Jaka część obrazu próbuje skopiować? zmień szerokość i wysokość w docelowym ctor, a szerokość i wysokość w Int32Rect, a także dwa pierwsze parametry (0,0), które są x & y przesunięte w obraz. Lub po prostu odejdź, jeśli chcesz skopiować całość.

BitmapSource source = sourceImage.Source as BitmapSource; 

// Calculate stride of source 
int stride = source.PixelWidth * (source.Format.BitsPerPixel + 7)/8; 

// Create data array to hold source pixel data 
byte[] data = new byte[stride * source.PixelHeight]; 

// Copy source image pixels to the data array 
source.CopyPixels(data, stride, 0); 

// Create WriteableBitmap to copy the pixel data to.  
WriteableBitmap target = new WriteableBitmap(
    source.PixelWidth, 
    source.PixelHeight, 
    source.DpiX, source.DpiY, 
    source.Format, null); 

// Write the pixel data to the WriteableBitmap. 
target.WritePixels(
    new Int32Rect(0, 0, source.PixelWidth, source.PixelHeight), 
    data, stride, 0); 

// Set the WriteableBitmap as the source for the <Image> element 
// in XAML so you can see the result of the copy 
targetImage.Source = target; 
+0

Dzięki! Miałem nadzieję, że będę mógł kopiować bezpośrednio z BitmapSource do WritableBitmap ... Teraz zastanawiam się, co tak naprawdę ma zrobić przeciążenie CopyPixels ... –

+1

Przeciążenie prostokąta skopiuje obraz bitmapowy do Int32Rect, więc nie jest tak użyteczny przekaż to do WriteableBitmap. Jeśli chcesz czegoś naprawdę krótkiego i chcesz skopiować cały obraz: * WriteableBitmap target = new WriteableBitmap (Pic1.Source jako BitmapSource); Pic2.Source = target; * –

+0

A jeśli chcę tylko część BitmapSource (potrzebuję prostokąta o stosunkowo małej wysokości i tej samej szerokości)? –

Powiązane problemy