2011-05-03 13 views
9

Sto provando a copiare una parte di un BitmapSource in un WritableBitmap.Copia da BitmapSource a WritableBitmap

Questo è il mio codice finora:

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(); 

ottengo "ArgumentException: Valore non rientra nell'intervallo previsto." nella riga di CopyPixels.

Ho provato a scambiare row.PixelHeight * row.BackBufferStride con row.PixelHeight * row.PixelWidth, ma poi ho un errore che dice che il valore è troppo basso.

Non sono riuscito a trovare un singolo esempio di codice utilizzando questo sovraccarico di CopyPixels, quindi sto chiedendo aiuto.

Grazie!

risposta

19

Quale parte dell'immagine sta tentando di copiare? cambia la larghezza e l'altezza nel target ctor, la larghezza e l'altezza in Int32Rect così come i primi due parametri (0,0) che sono x & y offset nell'immagine. O vai via se vuoi copiare tutto.

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

Grazie! Ho sperato che potessi copiare direttamente da BitmapSource a WritableBitmap ... Ora mi chiedo che cosa significhi veramente questo overload di CopyPixels ... –

+1

Il sovraccarico del rettangolo copierà l'immagine bitmap su un Int32Rect quindi non è così utile per passalo a WriteableBitmap. Se vuoi qualcosa di veramente breve e vuoi copiare l'intera immagine: * WriteableBitmap target = new WriteableBitmap (Pic1.Source as BitmapSource); Pic2.Source = target; * –

+0

E se desidero solo una parte di BitmapSource (ho bisogno di un rettangolo con un'altezza relativamente piccola e stessa larghezza)? –

Problemi correlati