C# - изменить форму массива и изменить тип на месте - PullRequest
1 голос
/ 26 февраля 2020

Я прочитал огромное изображение (например, 1.800MP @ 16 бит на пиксель) с диска. Magick.Net предоставляет мне 1-байтовый массив, поэтому каждый пиксель состоит из 2 элементов в массиве. Мне нужно иметь 2d массив ushort для обработки.

Излишне говорить, что BlockCopy и тому подобное запрещено - удвоение использования памяти не вариант.

Данные уже имеет правильный порядок в памяти, мне просто нужно как-то «привести» массив из byte[] в ushort[,].

Итак, в основном, я ищу функцию, которая делает это:

ushort[,] convertByteToUshort(byte[] arr, int width, int height)

Я знаю ширину и высоту изображения (и, следовательно, двумерный массив), и я предполагаю, что мне нужно будет использовать unsafe код и fixed для указателей. Но я понятия не имею, как преобразовать ссылку в истинную ushort[,].

Любые идеи?

1 Ответ

0 голосов
/ 26 февраля 2020

Попробуйте следующее:

        static ushort[] convertByteToUshort(byte[] arr)
        {
            List<ushort> data = new List<ushort>();

            for (int i = 0; i < arr.Length; i = +2)
            {
                data.Add((ushort)((arr[i] << 8) | arr[i + 1]));
            }
            return data.ToArray();
        }

Вот умный трюк, который я нашел около месяца go

        static void Main(string[] args)
        {
            ByteShort byteShort = new ByteShort();
            byteShort.bytes = new byte[100];
            byteShort.shorts = new short[50];
            for (int i = 0; i < byteShort.bytes.Length; i++)
            {
                byteShort.bytes[i] = (byte)i;
            }

            short[] data = byteShort.shorts;
        }
        [StructLayout(LayoutKind.Explicit)]
        public struct ByteShort
        {
            [FieldOffset(0)]
            public byte[] bytes;
            [FieldOffset(0)]
            public short[] shorts;
        }
...