BitBlt和AlpendBlend之间的视觉差异

时间:2017-11-03 21:12:36

标签: c++ winapi gdi+ gdi

我在一个带有透明背景的正方形中绘制一个实心圆,并使用位图DC上的gdi +填充颜色。因为我需要在不同的位置复制圆圈,所以如果填充颜色是不透明的,那么我使用bitblt做一些简单的alpha混合:

for(int i=0; i<num; ++i) {
   destDC->BitBlt(lx[i], ly[i], lwidth, lheight, srcDC, 0, 0, SRCAND);
}

如果填充颜色是半透明的,那么我需要像素方式的alpha混合:

BLENDFUNCTION f;
f.BlendOp = AC_SRC_OVER;
f.BlendFlags = 0;
f.SourceConstantAlpha = 255;
f.AlphaFormat = AC_SRC_ALPHA;
for(int i=0; i<num; ++i) {
   AlphaBlend(destDC->m_hDC, lx[i], ly[i], lwidth, lheight, 
              srcDC.m_hDC, 0, 0, lwidth, lheight, f); 
}

问题:为什么BitBlt和AlphaBlend绘制的圆圈看起来略有不同?我的意思是圆圈的位置和形状有点不同?我暂时陷入这个问题,因为填充颜色不透明时的绘制性能非常重要,我不能简单地在这里删除BitBlt函数。有任何解决方法可以解决这个问题吗?

一个小提示:当我使用TransparentBlt绘制不透明的情况时,圆圈的位置和形状与使用AlphaBlend的半透明情况完全相同。但是TransparentBlt的性能还不够好。

0 个答案:

没有答案
相关问题