вычисление размера строки растрового изображения - PullRequest
3 голосов
/ 24 апреля 2011

Я нашел этот источник , который работает довольно хорошо, я просто хочу спросить об этом куске кода, который я не получаю:

//calculate total size of RGBQUAD scanlines (DWORD aligned)

    bih.biSizeImage = (((bih.biWidth * 3) + 3) & 0xFFFC) * bih.biHeight ;

Я понимаю, почему есть "* 3", но не получите" +3 "и побитовое И с гекса FFFC.Может кто-нибудь объяснить мне, почему он вычисляет размер изображения таким образом?

Спасибо

1 Ответ

1 голос
/ 24 апреля 2011

Если вы попробуете это для различных значений, вы увидите, что оно на самом деле заставляет (ширина * 3) округлять до наименьшего кратного 4, которое будет содержать его.Он, вероятно, делает это, чтобы заставить вещи быть выровненными 32-битным.

Использование python:

>>> f = lambda x: ((x * 3) + 3) & 0xFFFC
>>> [f(x) for x in range(1, 20)]
[4, 8, 12, 12, 16, 20, 24, 24, 28, 32, 36, 36, 40, 44, 48, 48, 52, 56, 60]

Ниже показано различие между простым умножением и округлением вверх до кратного4

>>> [(3*x, f(x)) for x in range(1, 8)]
[(3, 4), (6, 8), (9, 12), (12, 12), (15, 16), (18, 20), (21, 24)]

Я удивлен, что код фактически не документирует этот факт.Переплетение битов - замечательная вещь, но это может показаться очень произвольным.

...