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

来源:互联网 发布:数据分析工程师 编辑:程序博客网 时间:2024/05/16 16:14

虽然操作系统提供了一个名为 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
 }
}