主题:图像中象素点的运算[半透明效果]
廖增祥
[专家分:3930] 发布于 2008-03-06 18:01:00
各位大虾:
我有个问题想请教大家。在很多软件中,都有图像的半透明效果。现在我想实现一种效果。
在绘图中,我首先用 BitBlt 函数绘制一幅背景图,然后再在其上绘制一幅前景图,我的目的是想实现一种半透明效果,使最后绘制出来的图像中既能看到前景图,又能看见背景图,最好是按比例,如背景图显示40%, 前景图显示60%, 不知这样该如何实现。谢谢!
最后更新于:2008-03-06 18:04:00
回复列表 (共3个回复)
沙发
华山论剑 [专家分:5310] 发布于 2008-03-07 09:14:00
我用VB做过,先要准备一张pattern图片,pattern图片就是上面有些黑点均匀分布的图片,以造成朦胧的效果,然后用这个pattern图片CreatePatternBrush,再选入dc,再将前景图画到背景上,后面的opcode是0xAC0744,这个code应该是几个动作的组合,具体是那些不太清楚。
我试过不用pattern图片,就做不出来(应该是我没找到方法),用了就行。
板凳
lisuimeng [专家分:490] 发布于 2008-03-07 12:05:00
得在C++中进行半透明处理是一项很大的工程,它的原理是取出所要处理的位置的位图的所有象素点,一一进行按百分比运算后相加,再读回去。还好C++的性能优越,可以
下边给出一个进行简单两副位图半透明处理的代码:
BITMAP bmpX,bmpY;
long bitmapSize=0;
DWORD dwValue,dwValue2;
mdc = new CDC;
bitmap = new CBitmap;
bgbmp = new CBitmap;
mdc->CreateCompatibleDC(dc);
bgbmp->m_hObject = (HBITMAP)::LoadImage( NULL,
"bground.bmp",
IMAGE_BITMAP,
rect.right,
rect.bottom,
LR_LOADFROMFILE );
bitmap->m_hObject = (HBITMAP)::LoadImage( NULL,
"girl.bmp",
IMAGE_BITMAP,
298,
329,
LR_LOADFROMFILE );
bitmap->GetBitmap(&bmpX);
int bitmapSize1 = bmpX.bmHeight * bmpX.bmWidthBytes;
BYTE* px=(BYTE *)GlobalAlloc(GPTR,bitmapSize1);
dwValue = bitmap->GetBitmapBits(bitmapSize1, px);
bgbmp->GetBitmap(&bmpY);
bitmapSize = bmpY.bmHeight * bmpY.bmWidthBytes;
BYTE* px1=(BYTE *)GlobalAlloc(GPTR,bitmapSize);
dwValue2 = bgbmp->GetBitmapBits(bitmapSize,px1);
if(bmpX.bmBitsPixel != 32 || bmpY.bmBitsPixel != 32)
{
::MessageBox(NULL,"此程序只能在 32 bit 显示模式中显示","警告",0);
return;
}
int rgb_b,x,y,i;
int PixelBytes = bmpX.bmBitsPixel / 8 ;
for(y=0; y < bmpX.bmHeight ; y++)
{
for( x = 0 ; x < bmpX.bmWidth ; x++)
{
rgb_b = y * bmpX.bmWidthBytes + x * PixelBytes ;
px[rgb_b+0] = (BYTE)(px[rgb_b+0]*0.5f);
px[rgb_b+1] = (BYTE)(px[rgb_b+1]*0.5f);
px[rgb_b+2] = (BYTE)(px[rgb_b+2]*0.5f);
}
}
for(y=0; y<(bmpX.bmHeight); y++)
{
for(x=0; x<(bmpX.bmWidth); x++)
{
rgb_b = (x)*PixelBytes + (y)*bmpY.bmWidthBytes;
i = (y) * bmpX.bmWidthBytes + (x) * PixelBytes ;
px1[rgb_b] = (BYTE)(px1[rgb_b] *0.5f + px[i]);
px1[rgb_b+1] = (BYTE)(px1[rgb_b+1] *0.5f + px[i+1]);
px1[rgb_b+2] = (BYTE)(px1[rgb_b+2] *0.5f + px[i+2]);
}
}
bgbmp->SetBitmapBits(bitmapSize,px1);
mdc->SelectObject(bgbmp);
GlobalFree((HGLOBAL)px);
GlobalFree((HGLOBAL)px1);
3 楼
廖增祥 [专家分:3930] 发布于 2008-03-08 00:17:00
谢谢,楼上两位,问题已经解决。
我来回复