C#的Bitmap类进行MakeTransparent(Color.Black)背景透明化后,图片边缘的锯齿怎么处理?

想用C#做个桌面宠物,但是素材是黑色背景的,

图片说明

于是我就用MakeTransparent(Color.Black)处理了一下,但是处理后的图片边缘却有锯齿

        Bitmap bitmap = new Bitmap(Application.StartupPath + "\\shell\\jh2\\surface0000.png");
        bitmap.MakeTransparent(Color.Black);

图片说明

我想要的结果应该是这样子边缘没有锯齿。

图片说明

看网上说g.SmoothingMode = SmoothingMode.AntiAlias; 可以抗锯齿,我试了试这样子处理

        Bitmap bitmap = new Bitmap(Application.StartupPath + "\\shell\\jh2\\surface0000.png");
        bitmap.MakeTransparent(Color.Black);
        Graphics g = Graphics.FromImage(bitmap);
        g.SmoothingMode = SmoothingMode.AntiAlias; 

但是却失败了。
我对C#不熟,不知道Bitmap怎么做抗锯齿,也不清楚我这Graphics抗锯齿为什么失败。。。

你原始素材有没有,如果没有,只能用PS把人物抠图出来,边缘做模糊处理了。

之所以边缘有黑色,就是因为C#只能把纯黑色当作透明色,而对于边缘接触部分(你放大看),这些地方的过渡的像素,是过渡的颜色,不是纯黑色的,就不会被替换成透明。

只有你有原始的素材,并且带透明的通道,才能完美呈现你要的效果,这种把某个纯色替换的透明,是不行的。

对橘花桌面精灵感兴趣不如加入橘花群或QQ:7620033

Pic放入png的Image,Mask放入pna的Image


        //Image转化为Bitamap
        public static Bitmap ToBitmap(Image pic)
        {
            //创建图像
            Bitmap tmp = new Bitmap(pic.Width, pic.Height);                //按指定大小创建位图
            Rectangle Rect = new Rectangle(0, 0, pic.Width, pic.Height);   //pic的整个区域

            //绘制
            Graphics g = Graphics.FromImage(tmp);                   //从位图创建Graphics对象
            g.Clear(Color.FromArgb(0, 0, 0, 0));                    //清空

            g.DrawImage(pic, Rect, Rect, GraphicsUnit.Pixel);       //从pic的给定区域进行绘制

            return tmp;     //返回构建的新图像
        }




         public static Bitmap CreateImageMask(Image Pic, Image Mask)
        {
            if (Pic == null)
            {
                return null;
            }
            Bitmap pic = ToBitmap(Pic);
            if (Mask == null)
            {
                return pic;
            }
            Bitmap mask = ToBitmap(Mask);
            if (pic.Width != mask.Width || pic.Height != mask.Height)
            {
                return pic;
            }
            Color C, C2;
            for (int i = 0; i < pic.Height; i++)
            {
                for (int j = 0; j < pic.Width; j++)
                {
                    C = pic.GetPixel(j, i);                    //读取原图像的RGB值
                    C2 = mask.GetPixel(j, i);                  //读取蒙板的透明度信息

                    //if (C2.R == 0) C = Color.FromArgb(0, 0, 0, 0);  // Color.Empty;
                    if (C2.R == 0) C = Color.Transparent;
                    else C = Color.FromArgb(C2.R, C.R, C.G, C.B);   //清除透明度信息

                    pic.SetPixel(j, i, C);
                }
            }
            return pic;

        }