2010-01-04 8 views
5

Ich verwende Marshal.Copy(), um die Pixelinformationen von einem Bitmap zu einem int[] Array zu kopieren, das Problem liegt in der Tatsache, dass die Informationen, die zu diesem Array kommen alle kommen falsch, wie:Bitmap zu int [] mit Marshal.Copy()

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

der Code für die Methode ist:

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; 

Als ich ein byte[] Array verwendet wird, die Informationen, die gespeichert wurde, war richtig, so weiß ich nicht, was geschieht Hier.

Antwort

5

Diese Werte sind vollkommen normal. Sie sind 32bpp Pixel mit dem Alpha-Kanal bei 0xff, dem üblichen Wert. Mit anderen Worten: -8682109 == 0xff7b8583. Jeder Alpha-Wert> = 128 macht den Wert negativ, weil er das Vorzeichenbit setzt.

Mit Uint [] anstelle von Int [] kann das einfacher zu sehen sein.

+0

Das Problem ist, dass die Methode Marshal.Copy nicht Uint [] nimmt, wissen Sie, wie ich diesen Wert manipulieren könnte, die RGB-Komponenten zu trennen? –

+0

Verwenden Sie Color.FromArgb(), es dauert ein Int. –

0

IMHO, Ihr Bytecount ist eine Anzahl von Bytes und jetzt teilen Sie Bytes durch 4 und erwartet eine Reihe von ganzen Zahlen, die wirklich Bytes sind. Die Besetzung wird nicht wie gewünscht ausgeführt.

eine Byte-Array konvertieren Array Verwendung in int:

System.BitConverter.ToInt32 (mybyteArray, 4);