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

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

 

转载于:https://www.cnblogs.com/hbg200/p/9960763.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值