СоздатьDIBSection под капотом

Я использую WINAPI CreateDIBSection() рисовать пиксель за пикселем, то я бита на DC. Мне любопытно. Что происходит с базовыми структурами данных CreateDIBSection? Структура BITMAPINFO хранит высоту ширины экрана / клиента. Затем VOID ** ppvBits обрабатывает 24-битные цвета. Так можно ли все это рассматривать как трехмерный массив? Похоже на это

int пиксели [высота] [ширина] [цвет]?

Я спрашиваю, почему CreateDIBSection() Функция очень-очень быстрая, но если я создаю похожий массив (900 * 1800 * (246 * 256 * 256)), это действительно очень медленно.

Как Microsoft получает этот метод так быстро и эффективно? Я перепробовал все. Int *** указатели на указатель на указатель, int*** malloc, пытался NEW и т.д., они все очень медленно работают на больших массивах. Мне просто любопытно, как я могу построить 3D-массив, который также работает. Какие-нибудь мысли?

Мне нужен массив около 20000x1800x100000. CreateDIBSection() хранит это быстро без проблем. Но как насчет стандартного dynmaic массива C / C ++?

Мне нужно хранить то, что в CreateDIBSection() а также BITMAPINFO во 2-м массиве.

-1

Решение

Он не использует трехмерный массив. Для цветов нужен только одномерный массив. Ты можешь получить X а также Y координаты из индекса и зная ширину растрового изображения.

row = index / width;
column = index % width;

Для 24-битного цвета размер матрицы width * height * 3 bytes (один байт для каждого цвета). Когда он загружается в память, он дополняется до 4 байтов (размер целого числа).

Ты можешь использовать GetDibBits для прямого доступа к битам

Смотрите также: растровый формат

1

Другие решения


По вопросам рекламы [email protected]