2011-05-03 10 views
9

BitmapSource'un bir bölümünü bir WritableBitmap'e kopyalamaya çalışıyorum. Bu benim defa kodudurBitmapSource'tan WritableBitmap'e kopyalama

: ": Değer beklenen aralıkta girmemektedir ArgumentException."

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

alıyorum CopyPixels satırında.

row.PixelHeight * row.BackBufferStride'u row.PixelHeight * row.PixelWidth ile değiştirmeyi denedim, ancak sonra değerin çok düşük olduğunu belirten bir hata alıyorum.

CopyPixels bu aşırı yüklemeyi kullanarak tek bir kod örneği bulamadım, bu yüzden yardım istiyorum.

Teşekkürler!

cevap

19

Görüntünün hangi bölümü kopyalanmaya çalışıyor? hedef ctor'daki genişlik ve yükseklik ile Int32Rect'teki genişlik ve yükseklik ile görüntünün içine x & y ofset olan ilk iki param (0,0) değerini değiştirin. Ya da her şeyi kopyalamak isterseniz bırakın.

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

Teşekkürler! BitmapSource'tan WritableBitmap'e doğrudan kopyalayabileceğimi umuyordum ... Şimdi, CopyPixels'in bu aşırı yükünün gerçekten ne anlama geldiğini merak ediyorum ... –

+1

Dikdörtgen aşırı yük, bitmap görüntüsünü Int32Rect'e kopyalayacaktır; bunu WriteableBitmap'e ilet. Gerçekten çok kısa bir şey istiyorsanız ve tüm görüntüyü kopyalamak istiyorsanız: * WriteableBitmap target = new WriteableBitmap (Pic1.Source BitmapSource olarak); Pic2.Source = target; * –

+0

Ve eğer BitmapSource'un sadece bir parçasını istiyorsanız (nispeten küçük bir yüksekliğe ve aynı genişliğe sahip bir dikdörtgene ihtiyacım var)? –