拷贝变换3字节像素到4字节内存

时间:2023-02-12 17:05:48

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