2010-09-14 8 views
7

Tengo un objeto 2208 x 3000 TransformedBitmap con el formato {Indexed8} que estoy haciendo. CoppyPixels() activado. Estoy usandoProblemas 'Stride' de un objeto TransformedBitmap

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

(suponiendo 'formattedBitmap' es el nombre de la imagen de la que estoy tratando de copiar el píxeles) para el valor de 'paso' en mi llamada a un método y una matriz de bytes que es 2208 de largo. Tengo algo así como que funciona en otro lugar del código (donde el formato de la imagen es {Gray8}. Sin embargo, cuando trato de hacer lo mismo en la imagen mencionada, continuamente obtengo un "Argumento fuera de rango" excepción que dice "El valor del parámetro no puede ser menor que '6624000'. \ r \ nNombre del parámetro: buffer."

Mis preguntas sobre esto son: ¿por qué el mismo código parece funcionar en un solo lugar y no el otro? ¿Qué en el mundo, en términos simples, realmente ES el 'zancada'? ¿Y cómo puedo obtener el efecto deseado (de copiar los bits) sin obtener este error? ¿Qué estoy haciendo mal?

Cualquier ayuda a esto sería muy apreciado. Muchas gracias!

Respuesta

9

He descubierto esto (wow ... ¡no puedo creer que haya pasado algo así como una hora jugando con esto!). El problema era que la matriz de bytes tiene que ser de un tamaño

sourceImage.PixelHeight * stride 

donde

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

La razón de que haya funcionado en otro lugar en mi código se debe a que en lugar de copiar los píxeles de la imagen completa (Como trato de hacer donde tenía el problema), solo estaba copiando los píxeles de una sola fila ... es decir, básicamente un área de 2008 x 1, de modo que el tamaño de la matriz de bytes de destino podría ser exactamente 2208 y funcionaría bien. Para referencia futura, algo así probablemente debería, más o menos, usarse siempre:

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

¡Salud!

+4

Ah, y MSDN tiene un artículo bastante decente sobre lo que es un 'zancada'. Ciertamente no son términos "sencillos" y realmente me parece un poco convulso, pero es una buena referencia, sin embargo (solo uno que podría necesitar leer varias veces para comprender realmente si es nuevo en el procesamiento de imágenes en C# (¡como yo!)) LINK: http://msdn.microsoft.com/en-us/library/aa473780(VS.85).aspx – JToland

+0

Como una persona que tiende a echar un vistazo al código (todos tenemos prisa ¿Verdad?) Vi su cálculo de zancada (el equivocado) y pasé media hora tratando de hacerlo funcionar antes de darme cuenta de que tenía la fórmula correcta más abajo. Sería bueno tener la fórmula correcta en la parte superior :) – Peter

Cuestiones relacionadas