LINUX.ORG.RU

[!nix][msdn](x * 32 + 31) / 32


0

1

Здравствуйте.

Нашел сегодня на msdn пример программы для захвата изображения окна - http://msdn.microsoft.com/en-us/library/dd183402(v=vs.85).aspx

И моё внимание привлёк один момент, смысл которого мне до конца не ясен.

//пропущено
bi.biBitCount = 32;    
//пропущено
DWORD dwBmpSize = ((bmpScreen.bmWidth * bi.biBitCount + 31) / 32) * 4 * bmpScreen.bmHeight;

Здесь вычисляется необходимое количество байт для изображения. Назначение переменных не трудно узнать из их имён. DWORD из msdn - «A DWORD is a 32-bit unsigned integer». Так на кой случай считают (bmpScreen.bmWidth * bi.biBitCount + 31) / 32? Разве результат вычисления будет отличен от значения bmpScreen.bmWidth?

Извиняюсь если вопрос из разряда оффтопов, но действительно интересно.


это оптимизация по-микрософтовски :)

а если серьёзно, bi.biBitCount - параметр и, если даже сейчас он 32, не факт что завтра он не будет 64

кроме того, в этом куске кода вычислительная эффективность могла быть не так уж и важна

shty ★★★★★
()

Зависит от значения bi.biBitCount. Например bmWidth = 1, bi.biBitCount = 1, результат (1 * 1 + 31) / 32= 1; bmWidth = 21, bi.biBitCount = 1, результат (21 * 1 + 31) / 32 = 1.

Такие вычисления проводят, чтобы выяснить, сколько байтов необходимо, чтобы уместить нужное число битов. Или, как в данном случае, сколько DWORD'ов нужно, чтобы уместить нужное число единиц меньшего размера (размер равен bi.biBitCount). В формуле число 31 следует читать как sizeof(DWORD) - 1, а 32 как sizeof(DWORD)

unC0Rr ★★★★★
()

Это для округления результата деления на 32 в большую сторону, т.е. предполагается что (bmpScreen.bmWidth * bi.biBitCount) не кратно 32.

bakugan
()

Спасибо за ответы. Отдельное спасибо unC0Rr за содержательный ответ.

mkam
() автор топика
Ответ на: комментарий от unC0Rr

Скажи, а чем тебе не нравится этот вариант кода?

где я сказал что мне он не нравится? :)

давай я тебе помогу прочитать текст поста после первой фразы:

а если серьёзно, bi.biBitCount - параметр и, если даже сейчас он 32, не факт что завтра он не будет 64

shty ★★★★★
()

Вроде, ((bmpScreen.bmWidth * bi.biBitCount + 31) / 32) * 4 - должна быть минимальная степень восьмёрки. Поэтому и такие костыли

hired777
()

Похоже, что тут вычисляется размер битмапа на основе питча, выровненному на 4 байта. Т.к. кол-во бит на пиксель может быт не равно 32 битам.

#include <stdio.h>

int main(int argc, const char *argv[])
{
    int bmHeight = 1;
    int biBitCount = 24;
    int bmWidth;
    for(bmWidth = 0; bmWidth < 32; bmWidth++)
    {
        unsigned dwBmpSize = ((bmWidth * biBitCount + 31) / 32) * 4 * bmHeight;

        printf("w = %d: %d - %d\n", bmWidth, dwBmpSize, bmWidth * bmHeight * biBitCount / 8);
    }
    return 0;
}
andreyu ★★★★★
()

в BMP количество байтов в строке должно быть выровнено по границе 4 байт, так что этот код видимо для этой цели

Harald ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.