for(unsigned int h=0; h<ImageBits.iHeight; h++) { for(unsigned int w=0; w<ImageBits.iWidth; w++) { // So in this loop - if our data isn't aligned to 4 bytes, then its been padded // in the file so it aligns...so we check for this and skip over the padded 0's // Note here, that the data is read in as b,g,r and not rgb as you'd think! unsigned char r,g,b; fread(&b, 1, 1, fp); fread(&g, 1, 1, fp); fread(&r, 1, 1, fp); ImageBits.pARGB[ w + h*ImageBits.iWidth ] = (r<<16 | g<<8 | b); }// End of for loop w //If there are any padded bytes - we skip over them here if( iNumPaddedBytes != 0 ) { unsigned char skip[4]; fread(skip, 1, 4 - iNumPaddedBytes, fp); }// End of if reading padded bytes }// End of for loop h我不理解此声明以及它如何存储像素的rgb值ImageBits.pARGB[ w + h*ImageBits.iWidth ] = (r<<16 | g<<8 | b);我读了 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 移位将组成值的位移动指定的数字。在这种情况下,它是用颜色值完成的,因此您可以在单个4字节结构(例如int)中存储多个1字节的成分(例如RGBA,其范围为0-255)。取这个字节:00000011等于十进制的3。如果我们要为RGB和A通道存储值3,则需要将此值存储在int(int为32位)中R G B A00000011 00000011 00000011 00000011如您所见,这些位以4组(每组8个)设置,并且全部等于值3,但是如何存储以这种方式存储的R值呢?如果摆脱了G / B / A值,您将获得00000011 00000000 00000000 00000000哪个仍然不等于3-(实际上,这是一个很大的数字-我认为是12884901888)为了使该值进入int的最后一个字节,您需要将这些位右移24位。例如12884901888 >> 24然后这些位将如下所示:00000000 00000000 00000000 00000011而且您的价值将为“ 3”基本上,这只是在存储结构中移动位的一种方法,以便您可以更好地操纵值。将RGBA值放入单个值通常称为填充位关于c++ - C++ BMP按位运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10756454/ (adsbygoogle = window.adsbygoogle || []).push({});
10-08 21:59