大部分原始像素为24位的,即RGB888格式,以连续3个8位为一个像素存储在文件中,比如BMP文件,计算机内存则是以8位、16位、32位、64位等结构存储数据的,如果读取文件存于内存,因为没有24位这一种结构,即发生像素错位,GDI显示考虑到了这一问题,当biBitCount = 24时,GDI内部进行调整,当biBitCount = 32时,则需要对齐32位,每32位的低24位为RGB888,为一个像素。考虑到后续显示数据结构的多样性,所以写了一个变换函数。
void CopyImage3To4Mem(void *pDst, void *pSrc, WORD wFrameWidth, WORD wFrameHeight) // 拷贝变换3字节像素到4字节内存{ _asm { mov bx, wFrameHeight;// 传递帧高度 mov esi, pSrc; // 传递源指针 mov edi, pDst; // 传递目标指针 L1: // 高度循环 mov cx, wFrameWidth; // 传递一行计数 L0: //行循环 mov al, [esi + 0]; //取出B mov ah, [esi + 1]; //取出G mov dl, [esi + 2]; //取出R mov [edi + 0], al; //存入R mov [edi + 1], ah; //存入G mov [edi + 2], dl; //存入B add esi, 3; // 源步进3字节 add edi, 4; // 目标步进4字节 dec cx; // 减一像素点 jnz L0; // 一行循环判断 dec bx; jnz L1; //减一行高度判断 }}
需要显示的数据必须拷贝到显示内存,函数以拷贝方式传递变换,源每次步进3个字节,目的步进4个字节,仅传递3个字节。 目的必须4个字节对齐。
以上函数在64位Win10,C++Builder 6编译通过,结果正确。