我在一个带有透明背景的正方形中绘制一个实心圆,并使用位图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的性能还不够好。