RGB(5,6,5)位图混合算法优化

ww841020 2012-07-08 11:55:22
嘿 各位:
我现在在WINCE上处理一张800X480的RGB565的位图混合算法,是逐个像素混合,下面是具体的混合算法,但是速度还是达不到理想效果,想了很多天了没有找到解决方法,请各位给点建议!谢谢
for (int i=0;i<nDrawHeight;i++)//图像高度
{
for (int j=0;j<nDrawWidth;j++)//图像宽度
{
BYTE btAlp = *(LPBYTE)( m_LpAlpData+nSrcBegIdxAlp); //获取ALP值
if ( btAlp==ALLTRANSPARENTVAL) //如果ALP为0 全透
{
//全透
}
else if ( btAlp ==NOTRANSPARENTVAL) //如果ALP为255 不透
{
//不透直接赋值
*(WORD*)( lpBtDstData+nDstBegIdx) =*(WORD*)( m_LpImageData +nSrcBegIdx);
}
else
{
//ALPHA混合
WORD wdR,wdG,wdB;
WORD wdPixelSrc =*((WORD*)(m_LpImageData+nSrcBegIdx ));//源图像像素值
WORD wdPixelDst =*((WORD*)( lpBtDstData+nDstBegIdx )); //目的图像素值
BYTE btOtherAlp = 255-btAlp;
//RED颜色分量混合
wdR = ((GETREDVALNOTRAN(wdPixelSrc)*btAlp + GETREDVALNOTRAN(wdPixelDst)*(btOtherAlp))>>8)&REDMASK;
//GREEN颜色分量混合
wdG = ((GETGREENVALNOTRAN(wdPixelSrc)*btAlp + GETGREENVALNOTRAN(wdPixelDst)*(btOtherAlp))>>8)&GREENMASK;
//BLUE颜色分量混合
wdB = ((GETBLUEVALNOTRAN(wdPixelSrc)*btAlp + GETBLUEVALNOTRAN(wdPixelDst)*(btOtherAlp))>>8)&BLUEMASK;

*(WORD*)( lpBtDstData+nDstBegIdx) = (wdR|wdG|wdB); //最终颜色值
}

}
nSrcBegIdx=nSrcBegIdx+2; //下一个源像素索引
nDstBegIdx=nDstBegIdx+2; //下一个目的像素索引
nSrcBegIdxAlp++; //ALP值索引
}
nDstBegIdx = (nDstBegIdxbk=nDstBegIdxbk+nLineBytesDst);
nSrcBegIdx = (nSrcBegIdxbk=nSrcBegIdxbk+nLineBytesSrc);
nSrcBegIdxAlp = (nSrcBegIdxAlpbk = nSrcBegIdxAlpbk+m_stImageAttribute.m_dwWidth);
}
...全文
144 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianzhaoling 2012-07-09
  • 打赏
  • 举报
回复
呵....半透明混合 由CPU来算是个很慢的过程....
如果平台允许 可以考虑用MMX来加速 如果不行 个人意见可从以下两方面入手
1.如果两幅位图分辨率相同,嵌套循环可以改为单循环;
2.由于像素格式是16位的,可以用一个int(32位)一次性混合一对像素的3个通道,不用三个通道分开混合。
具体说来 是将原RRRRR GGGGGG BBBBB格式通过掩码运算、位移运算转换为(高16位)0000GGGGGG000000(低16位)RRRRR000000BBBBB 然后使用 (前景 - 背景)* 透明度 / 32 + 背景 的公式一次性混合三个通道
xiaohuh421 2012-07-08
  • 打赏
  • 举报
回复
随机访问应该已经是最快的方法了

建议优化你的for循环里面的东西, 因为循环的次数较多, 所以每多执行一条语句, 时间都是不一样的.

再有就是建议在Release模式下测试覆效率, 代码优化后, 速度应该会快很多.

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧