2010-09-14 9 views
7

Mam obiekt TransformedBitmap o rozmiarze 2208 x 3000 z formatem {Indexed8}, który robię .CopyPixels(). Używam"Stride" Woes z obiektu TransformedBitmap

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

(zakładając „formattedBitmap” to nazwa obrazu, z którego próbuję skopiować pikseli) dla „stride” wartości w moim wywołanie metody i tablicy bajtów, które jest 2208 długości. Mam coś takiego jak to działa gdzie indziej w kodzie (gdzie format obrazu to {Gray8}). Jednak tam, gdzie próbuję zrobić to samo na powyższym obrazie, ciągle dostaję "Argument poza zasięgiem" wyjątek mówiąc "Wartość parametru nie może być mniejsza niż" 6624000 ". \ r \ n Nazwa parametru: bufor."

Moje pytania na ten temat są następujące: dlaczego na świecie ten sam kod działa w jednym miejscu, a nie Drugi? Co na świecie, według laika, naprawdę jest "krokiem" i jak mogę uzyskać pożądany efekt (kopiowania bitów) bez uzyskania tego błędu? Co robię źle?

Dowolna pomoc do tego byłoby bardzo docenione.Dzięki bardzo!

Odpowiedz

9

Wymyśliłem to (wow ... nie mogę uwierzyć, że spędziłem z nim prawie godzinę!). Problem polegał na tym, że tablica bajt musi być wielkości

sourceImage.PixelHeight * stride 

gdzie

int stride = (int)((sourceImage.PixelWidth * sourceImage.Format.BitsPerPixel + 7)/8); 

Powodem, że pracował w innym miejscu w kodzie jest, bo zamiast kopiowania pikseli dla całego obrazu (jak próbuję zrobić tam, gdzie miałem problem), kopiowałem tylko piksele z jednego wiersza ... to jest w zasadzie obszar 2008 x 1, tak aby rozmiar docelowej tablicy bajtów mógł być dokładnie 2208 i wszystko będzie dobrze. W celu późniejszego wykorzystania, coś takiego powinno być zawsze, mniej lub więcej, używane:

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

Pozdrawiam!

+4

Och, a MSDN ma całkiem przyzwoity artykuł na temat tego, czym jest "krok". Z pewnością nie jest to termin "laika", a ja rzeczywiście uważam, że jest to trochę zniechęcony, ale jest to dobre odniesienie nie mniej ważne (wystarczy, że będziesz musiał przeczytać wiele razy, aby naprawdę zrozumieć, czy jesteś nowy w przetwarzaniu obrazu w C# (tak jak ja!)) LINK: http://msdn.microsoft.com/en-us/library/aa473780(VS.85).aspx – JToland

+0

Jako osoba, która ma tendencję do spojrzenia na kod (wszyscy się spieszymy prawda?) Zobaczyłem twoje obliczenia kroku (niewłaściwe) i spędziłem pół godziny próbując zmusić to do pracy zanim uświadomiłem sobie, że masz poprawną formułę dalej w dół. Byłoby miło mieć prawidłową formułę na górze :) – Peter