Я использую Marshal.Copy()
скопировать информацию о пикселе с a Bitmap
к int[]
массив, проблема находится в том, что информация, которая приходит к этому массиву, прибывает неправильно, как:
[0] = -8682109;
[1] = -8682109;
[2] = -8616573;
[3] = -8616573;
[4] = -8550527;
and so on...
код для метода:
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;
Когда я использовал a byte[]
массив, информация, которая хранилась, был корректен, таким образом, я не знаю то, что происходит здесь.
Эти значения совершенно нормальны. Это 32bpp пиксела с альфа-каналом в 0xff, обычное значение. Другими словами: -8682109 == 0xff7b8583. Любое значение альфа >= 128 сделает значение отрицательным, потому что оно устанавливает знаковый бит.
Использование uint[] вместо int[] может сделать это проще.
.IMHO, ваш байт - это число байтов, и теперь вы делите байты на 4 и ожидаете набор целых чисел, которые на самом деле являются байтами. Приближение выполняется не так, как вы хотите.
Для преобразования массива байт в массив int используйте:
System.BitConverter.ToInt32(mybyteArray,4);
.