大部分原始像素为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编译通过,结果正确。