16位图像Alpha混合的实现

本文介绍了16位565格式图像Alpha混合的实现,包括基础算法、一次处理两个像素的优化方法以及使用MMX指令进行进一步加速的实现。通过比较,展示了MMX版本的算法在性能上的显著提升。
摘要由CSDN通过智能技术生成

Alpha 混合的算法很简单,基于下面的公式就可以实现:

D := A * (S - D) / 255 + D

D 是目标图像的像素,

S 是源图像的像素

A Alpha 值, 0 为全透明, 255 为不透明。

 

下面是 16 565 格式的混合算法的实现,首先用最简单的方式实现,即逐个像素的处理:

 

// 一次处理一个像素,比较简单,但速度较慢

procedure AlphaBlend656(BmpDst, BmpSrc: TBitmap; Alpha: Byte);

var

  i, j, W, H: Integer;

  pSrc, pDst: PWord;

  wSR, wSG, wSB: Word;

  wDR, wDG, wDB: Word;

begin

  // 确定高宽

  if BmpDst.Width > BmpSrc.Width then

    W := BmpSrc.Width

  else

    W := BmpDst.Width;

  if BmpDst.Height > BmpSrc.Height then

    H := BmpSrc.Height

  else

    H := BmpDst.Height;

 

  for i := 0 to H - 1do

  begin

    pSrc := BmpSrc.ScanLine[i];

    pDst := BmpDst.ScanLine[i];

    for j := 0 to W - 1 do

    begin

      // D := A * (S - D) / 255 + D

 

      wSR := (pSrc^ shr 11);

      wSG := (pSrc^ shr 5) and $3F;

      wSB := pSrc^ and $1F;

 

      wDR := (pDst^ shr 11);

      wDG := (pDst^ shr 5) and $3F;

      wDB := pDst^ and $1F;

 

      pDst^ := (((Alpha * (wSR - wDR) shr 8) + wDR) shl 11) or

               (((Alpha * (wSG - wDG) shr 8) + wDG) shl 5) or

               ((Alpha * (wSB - wDB) shr 8) + wDB);

 

      Inc(pSrc);

      Inc(pDst);

    end;

  end;

end;

 

实现起来很简单,但速度比较慢,其实存在着一次处理两个像素的算法,下面是代码:

 

// 一次处理两个像素 , 所以速度是 AlphaBlend656 2

procedure AlphaBlend656Fast(BmpDst, BmpSrc: TBitmap; Alpha: Byte);

var

  i, j, W, H: Integer;

  pSrc, pDst: PWord;

  dwSR, dwSG, dwSB: LongWord;

  dwDR, dwDG, dwDB: LongWord;

  dwAd

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值