Replace GDI+ DrawImage with PInvoked GDI and transparent PNG's

后端 未结 2 1984
耶瑟儿~
耶瑟儿~ 2020-12-30 13:52

I\'ve created an image service in C# which takes a base layer image (JPG), layers one more more transparent PNG\'s (32 bit), and then outputs a final JPG image. I\'m tryin

2条回答
  •  醉酒成梦
    2020-12-30 14:29

    This one should work:

        private Bitmap GetImage() {
            //##################### Get the Bitmaps ############################
            Bitmap sourceImage = new Bitmap("c:\\1.png");
            Bitmap overlayImage = new Bitmap("c:\\2.png");
    
            //##################### Get Hdc from baselayer ############################
            Graphics sourceImageGraphics = Graphics.FromImage(sourceImage);
            IntPtr sourceImageHDC = sourceImageGraphics.GetHdc();
    
            //##################### Get Cdc from second layer ############################
            IntPtr overlayImageCDC = CreateCompatibleDC(sourceImageHDC);
            IntPtr overlayImageHandle = overlayImage.GetHbitmap();
            SelectObject(overlayImageCDC, overlayImageHandle);
    
            /*
             * BitBlt from sourceImage is not neccessary,
             * because Graphics.FromImage(sourceImage) already did it for you
            */
    
            //##################### Draw the second layer ############################
            AlphaBlend(sourceImageHDC, 0, 0, overlayImage.Width, overlayImage.Height, overlayImageCDC, 0, 0, overlayImage.Width, overlayImage.Height, new BLENDFUNCTION(AC_SRC_OVER, 0, 0xff, AC_SRC_ALPHA));
    
            //##################### Release everthing ############################
            sourceImageGraphics.ReleaseHdc(sourceImageHDC);
            sourceImageGraphics.Dispose();
    
            DeleteDC(overlayImageCDC);
            DeleteObject(overlayImageHandle);
    
            //##################### Return Image ############################
            return sourceImage;
        }
    

提交回复
热议问题