2011-04-23 4 views
3

j'ai trouvé this source qui fonctionne très bien, je veux juste poser des questions sur ce morceau de code que je n'obtiens pas:calcul de la taille de la ligne bitmap

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

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

Je reçois pourquoi il y a « * 3 », mais ne se le "+3" et le ET bit à bit avec FFFC hexa. Quelqu'un pourrait-il m'expliquer pourquoi il clature la taille de l'image de cette façon?

Merci

Répondre

1

Si vous essayez cela pour différentes valeurs, vous verrez qu'il est réellement forcer (largeur * 3) pour arrondir au plus petit multiple de 4 qui contiendra elle. Il le fait probablement pour que les choses soient alignées sur 32 bits.

En utilisant 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] 

Ce qui suit montre la différence entre simplement faire la multiplication droite et arrondi vers le haut vers un multiple de 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)] 

Je suis surpris que le code ne fait pas documenter ce fait. La manipulation des bits est une chose merveilleuse, mais cela peut sembler très arbitraire.

+0

Considérant que RGBQUAD est une structure de quatre octets, il est logique maintenant. Je l'ai. Merci! – Smejki

Questions connexes