以前提了一个问题,在C#中如何使用TransparentBlt函数去贴位图,已经实现了。
现在的问题是:有一张草地的背景图和一个足球的位图,按button1能将足球背景透明化,然后贴到草地上去。
现在我想按button2,将足球从草地上移除?初步设想,能不能使用BitBlt函数进行一些SRCAND、SRCPAINT等运算,但具体的算法不知如何设计,请高手路过的指点一下,最好能给出一个完整代码函数。万分感谢!(持续关注,1周内急用)
以下是button1事件代码:
            IntPtr memdc = CreateCompatibleDC(g.GetHdc());
            SelectObject(memdc, zuqiuBmp.GetHbitmap());
            Graphics gZQ = Graphics.FromHdc(memdc);
            Graphics gCD = Graphics.FromImage(caodiBmp);
            IntPtr dcZQ = gZQ.GetHdc();
            IntPtr dcCD = gCD.GetHdc();
            TransparentBlt(dcCD, 0, 0,50, 50, dcZQ, 0, 0, zuqiuBmp.Width, zuqiuBmp.Height, ParseRGB(Color.White));
            gZQ.ReleaseHdc(dcZQ);
            gCD.ReleaseHdc(dcCD);
            panel_qipan.BackgroundImage = caodiBmp;

解决方案 »

  1.   

    建议lz将合成的图像,用Photoshop找到一个去除足球的方法,然后再考虑算法。
      

  2.   

    为啥会用到API?
    GDI+不是本身就支持Alpha混合绘图的吗?
      

  3.   

    如果你已经把足球"画"到草地上了,你移除后那里就空白了,
    你要用过Photoshop你就理解了...
    除非是2个图层 你去掉一个 足球图层,显示草地图层
    如果你想显示足球,就在草地上加一个图层 画上足球
      

  4.   

    您使用的是BitBlt,而该函数对于Alpha(透明通道)无法支持.如果您需要绘制透明的图像,可以使用GDI+
      

  5.   

    稍候.我给您编写一个示例,由于我只会使用VB.NET.我将在示例编写完成后转成C#提供.您到时不妨参考一下.
      

  6.   

    private Bitmap GetTransparentBitmap(Bitmap SourceBitmap, int TransparentValue) 

        Bitmap BP = default(Bitmap); 
        if (BP != null) BP.Dispose(); 
        BP = new Bitmap(SourceBitmap); 
        SX = BP.Width; 
        SY = BP.Height; 
        bmpDATA = BP.LockBits(new Rectangle(0, 0, SX, SY), Imaging.ImageLockMode.ReadWrite, Imaging.PixelFormat.Format32bppArgb); 
        BTSlength = bmpDATA.Stride * BP.Height; 
        byte[] BTS = new byte[BTSlength + 1]; 
        System.Runtime.InteropServices.Marshal.Copy(bmpDATA.Scan0, BTS, 0, BTSlength); 
        for (int J = 0; J <= BTSlength - 1; J += 4) { 
            //BTS(J + 3) = BTS(J + 3) / 100 * TransparentValue 
            BTS(J + 3) = 100; 
        } 
        System.Runtime.InteropServices.Marshal.Copy(BTS, 0, bmpDATA.Scan0, BTSlength); 
        BP.UnlockBits(bmpDATA); 
        return BP; 
    } 使用方法:this.BackGroundImage=GetTransparentBitmap("c:\123.jpg",50)
    // 50为透明度,范围在 0-100 之间