2010-01-04 17 views
5

Estoy usando Marshal.Copy() para copiar la información de píxeles de Bitmap en una matriz int[], el problema reside en el hecho de que la información que está llegando a esta matriz está llegando todos mal, como:Mapa de bits a int [] usando Marshal.Copy()

   [0] = -8682109; 
      [1] = -8682109; 
      [2] = -8616573; 
      [3] = -8616573; 
      [4] = -8550527; 
      and so on... 

el código para el método es:

private unsafe int[] BmpToBytes_Unsafe(Bitmap bmp) 
    { 
     BitmapData bData = bmp.LockBits(new Rectangle(new Point(), bmp.Size), 
      ImageLockMode.ReadOnly, 
      PixelFormat.Format32bppRgb); 

     // number of bytes in the bitmap 
     byteCount = bData.Stride * (bmp.Height); 

     int[] bytes = new int[byteCount/4]; 

     Marshal.Copy(bData.Scan0, bytes, 0, byteCount/4); 

     // don't forget to unlock the bitmap!! 
     bmp.UnlockBits(bData); 

     return bytes; 

Cuando yo estaba usando una matriz byte[], la información que se almacena era correcto, así que no sé lo que está sucediendo aquí.

Respuesta

5

Esos valores son perfectamente normales. Son píxeles de 32bpp con el canal alfa a 0xff, el valor habitual. En otras palabras: -8682109 == 0xff7b8583. Cualquier valor alfa> = 128 hará que el valor sea negativo porque establece el bit de signo.

Usar uint [] en lugar de int [] puede hacer que sea más fácil de ver.

+0

El problema es que el método Marshal.Copy no funciona [], ¿sabes cómo podría manipular ese valor, separando los componentes RGB? –

+0

Use Color.FromArgb(), toma una int. –

0

En mi humilde opinión, su byte es un número de bytes y ahora está dividiendo los bytes por 4 y esperando un conjunto de enteros, que en realidad son bytes. El lanzamiento no se realiza como lo quieres.

Para convertir un conjunto de bytes a int uso array:

System.BitConverter.ToInt32 (mybyteArray, 4);

Cuestiones relacionadas