Битовый массив к интервалу [] использующий Маршала. Копия ()

Я использую 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[] массив, информация, которая хранилась, был корректен, таким образом, я не знаю то, что происходит здесь.

5
задан BartoszKP 29 September 2013 в 21:47
поделиться

2 ответа

Эти значения совершенно нормальны. Это 32bpp пиксела с альфа-каналом в 0xff, обычное значение. Другими словами: -8682109 == 0xff7b8583. Любое значение альфа >= 128 сделает значение отрицательным, потому что оно устанавливает знаковый бит.

Использование uint[] вместо int[] может сделать это проще.

.
5
ответ дан 14 December 2019 в 19:15
поделиться

IMHO, ваш байт - это число байтов, и теперь вы делите байты на 4 и ожидаете набор целых чисел, которые на самом деле являются байтами. Приближение выполняется не так, как вы хотите.

Для преобразования массива байт в массив int используйте:

System.BitConverter.ToInt32(mybyteArray,4);

.
0
ответ дан 14 December 2019 в 19:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: