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