回 帖 发 新 帖 刷新版面

主题:图像中象素点的运算[半透明效果]

各位大虾:
    我有个问题想请教大家。在很多软件中,都有图像的半透明效果。现在我想实现一种效果。
在绘图中,我首先用 BitBlt 函数绘制一幅背景图,然后再在其上绘制一幅前景图,我的目的是想实现一种半透明效果,使最后绘制出来的图像中既能看到前景图,又能看见背景图,最好是按比例,如背景图显示40%, 前景图显示60%, 不知这样该如何实现。谢谢!

回复列表 (共3个回复)

沙发

我用VB做过,先要准备一张pattern图片,pattern图片就是上面有些黑点均匀分布的图片,以造成朦胧的效果,然后用这个pattern图片CreatePatternBrush,再选入dc,再将前景图画到背景上,后面的opcode是0xAC0744,这个code应该是几个动作的组合,具体是那些不太清楚。

我试过不用pattern图片,就做不出来(应该是我没找到方法),用了就行。

板凳

得在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 楼

谢谢,楼上两位,问题已经解决。

我来回复

您尚未登录,请登录后再回复。点此登录或注册