2010-09-14 18 views
7

Yaptığım formatta {Indexed8} olan bir 2208 x 3000 TransformedBitmap nesnesine sahibim .CopyPixels() açık. Ben 'Stride' Bir TransformedBitmap Nesnesinden Yaralanmalar

(int)((formattedBitmap.PixelWidth * formattedBitmap.Format.BitsPerPixel + 7)/8) 

kullanıyorum benim yöntem çağrısında 'adım' değeri ve olduğu bir bayt dizisi için ('formattedBitmap' varsayarak ben pikselleri kopyalamak çalışıyorum hangi resmin adıdır) 2208 uzunluğunda. Kodun başka bir yerinde çalışan bu gibi bir şey var (resmin biçiminin {Gray8} olduğu yer. Ancak, aynı şeyi yukarıda bahsedilen görüntü üzerinde yapmaya çalıştığım yerde, sürekli olarak bir "Bağımsız Değişken" aldım. "Parametre değeri" 6624000'den küçük olamaz. "r \ nParametre adı: arabellek."

Bu konuyla ilgili sorularım: neden dünyanın tam olarak aynı kodun tek bir yerde çalıştığı görünmüyor diğeri? Dünyada, tabanda, gerçekten 'adım' nedir? Ve bu hatayı almadan, istenen etkiyi nasıl alabilirim (bitlerin kopyalanması)? Neyi yanlış yapıyorum?

Herhangi bir yardım Bu çok takdir olurdu.Çok teşekkürler!

cevap

9

Ben bunu anladım (vay ... bir saat içinde bu kadar karmaşık bir şey geçirdiğime inanamıyorum!). Sorun bayt dizisi boyutu

sourceImage.PixelHeight * stride 

arasında olması gerektiğini nerede

int stride = (int)((sourceImage.PixelWidth * sourceImage.Format.BitsPerPixel + 7)/8); 
benim kodunda başka bir yerde çalıştı nedeni değil tüm görüntü için piksel kopyalama daha

(meseleyi yaptığım yerde yapmaya çalıştığım gibi), sadece tek bir satırın piksellerini kopyaladım ... yani, temelde 2008 x 1 alanı, böylece hedef bayt dizisinin büyüklüğü tam 2208 ve iyi çalışır. Gelecekte başvurmak için, bu gibi bir şey muhtemelen daha fazla veya daha az kullanılmalıdır:

int width = source.PixelWidth; 
int height = source.PixelHeight; 
int stride = width * ((source.Format.BitsPerPixel + 7)/8); 

byte[] bits = new byte[height * stride]; 

source.CopyPixels(bits, stride, 0); 

Şerefe!

+4

Oh, ve MSDN bir 'adım' ne hakkında oldukça iyi bir makaleye sahiptir. Kesinlikle "layman'ın" şartları değil ve ben aslında biraz konvüle buldum, ama iyi bir referans yok-az-(C# içinde görüntü işleme için yeni olup olmadığını anlamak için birden fazla kez okumak için sadece bir kez gerekebilir (olduğum gibi!)) LINK: http://msdn.microsoft.com/en-us/library/aa473780(VS.85).aspx – JToland

+0

Kod üzerinden bakmaya eğilimli bir kişi olarak (hepimiz acelemiz var) Doğru?) Adım hesaplamanızı gördüm (yanlış olanı) ve yarım saat kadar çalıştıktan sonra doğru formülü aldığınızı anlamaya çalışın. En üstte doğru formüllere sahip olmak güzel olurdu :) – Peter

İlgili konular