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

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

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

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

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

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

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

1 ответ

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

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

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

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

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

Другие вопросы по тегам