Создайте DIBSection под капотом

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

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

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

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

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

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


person James Rockford    schedule 07.07.2015    source источник
comment
Что именно вы говорите, действительно очень медленно? Распределение? Как-то использовать память? За исключением некоторых особых случаев (например, при копировании DirectX из видео в системную оперативную память), память обычно является памятью, независимо от того, выделена ли она CreateDIBSection или malloc.   -  person Jonathan Potter    schedule 08.07.2015
comment
Вы выделяете слишком много памяти. Аналогичный массив будет 900*1800*3, так как на каждый пиксель у вас есть 3 байта (4, если у вас есть альфа, плюс несколько байтов в конце каждой строки для выравнивания). Это не трехмерный массив, это двумерный массив значений цвета.   -  person Fabio Ceconello    schedule 08.07.2015


Ответы (1)


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

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

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

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

См. также: формат растрового изображения

person Barmak Shemirani    schedule 07.07.2015