TFAlphaBlend 用于透明度计算函数 汇编代码

虽然操作系统提供了一个名为 AlphaBlend的API函数,实现了DC之间的ALPHA效果。

但我的程序中并不需要对DC进行操作,只需要对指定颜色数组进行ALPHA计算并存回数组后,再存回文件。

因此,在网上查了下图像透明度的算法,按网上算法果然好用,不过数据点过多的时候效率稍低一些,所以抽时间写了段汇编代码来实现Alpha功能,并在此与大家分享,愿我的代码能对大家有所帮助,由于我的汇编水平属菜鸟级别,更希望高手帮忙优化代码,提高运行效率。

此代码在VC6.0下编译通过


// DstColor 目标颜色数组,函数返回后,存储经过ALPHA计算的颜色数组

// SrcColor 源颜色数组

// Alpha 透明度 0-255

// Count 颜色数组长度

 

void TFAlphaBlend(COLORREF* DstColor, COLORREF* SrcColor, BYTE Alpha, DWORD Count)
{
 __asm
 {

//将要用到的寄存器入栈
  push ebx
  push ecx
  push edx
  push esi
  push edi

//处理参数
  mov esi, SrcColor
  mov edi, DstColor
  mov ecx, Count
  mov bl, Alpha
  sub esi, 4
  sub edi, 4
  mov al, 255
  sub al, bl
  mov bh, al

//进入ALPHA计算
ABlend_LOOP1:

//计算红色分量
  mov eax, [esi+ecx*4]
  mul bl
  mov dx, ax
  mov eax, [edi+ecx*4]
  mul bh
  add eax, edx
  shr eax, 8

//将红色分量结果写回DstColor[ecx]

  mov byte ptr [edi+ecx*4], al

//计算绿色分量
  mov eax, [esi+ecx*4]
  shr eax, 8
  mul bl
  mov dx, ax
  mov eax, [edi+ecx*4]
  shr eax, 8
  mul bh
  add eax, edx
  shr eax, 8

//将绿色分量结果写回DstColor[ecx]

  mov byte ptr [edi+ecx*4]+1, al

//计算蓝色分量
  mov eax, [esi+ecx*4]
  shr eax, 16
  mul bl
  mov dx, ax
  mov eax, [edi+ecx*4]
  shr eax, 16
  mul bh
  add eax, edx
  shr eax, 8

//将蓝色分量结果写回DstColor[ecx]

  mov byte ptr [edi+ecx*4]+2, al
  LOOP ABlend_LOOP1

//计算结束,出栈
  pop edi
  pop esi
  pop edx
  pop ecx
  pop ebx
 }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值