想用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;
}