您的图像具有半透明像素。 TransparencyKey
只会使一个颜色透明。所以边缘的像素将显示图像的色彩和Parent
控件或窗体的颜色的混合..
这里是一个函数,使它们完全透明消除了所有的半透明像素:
using System.Runtime.InteropServices;
..
public static void UnSemi(Bitmap bmp)
{
Size s = bmp.Size;
PixelFormat fmt = bmp.PixelFormat;
Rectangle rect = new Rectangle(Point.Empty, s);
BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadOnly, fmt);
int size1 = bmpData.Stride * bmpData.Height;
byte[] data = new byte[size1];
System.Runtime.InteropServices.Marshal.Copy(bmpData.Scan0, data, 0, size1);
for (int y = 0; y < s.Height; y++)
{
for (int x = 0; x < s.Width; x++)
{
int index = y * bmpData.Stride + x * 4;
// alpha, threshold = 255
data[index + 3] = (data[index + 3] < 255) ? (byte)0 : (byte)255;
}
}
System.Runtime.InteropServices.Marshal.Copy(data, 0, bmpData.Scan0, data.Length);
bmp.UnlockBits(bmpData);
}
请注意,这也意味着漂亮的消除锯齿的外观会变得有些粗糙。
另请注意,该例程采用32位ARGB像素格式,因为PNGs
通常会有。
最后请注意,由于图像有lot的Black
您应该选择不同的颜色。 Fuchsia
是在野外龙的世界,而罕见的,但也许不是,你想挑一些随机的颜色..
另外:你要设置的pictureBox1.BackColor = Color.Transparent
..
最后:有时它是有道理的到threshold
参数添加到函数签名来设置从开启阿尔法所有或关闭一个水平..
下面是一个使用例如:
this.BackColor = Color.FromArgb(1,2,3,4);
this.TransparencyKey = this.BackColor;
UnSemi((Bitmap)this.pictureBox1.Image);
![enter image description here](https://i.stack.imgur.com/Vmkun.jpg)
来源
2017-04-12 15:20:15
TaW
很确定这与图像有关,而不是代码,图像本身的轮廓 –
您可以发布有关图像格式的细节吗?所以我们可以知道它是否支持alpha通道,这可能是这张图片边缘问题最可能的原因,没有像png文件那样的适当的alpha通道。消除锯齿将永远不会正确渲染。反锯齿就是你需要在背景透明的情况下将曲面边缘与背景混合在一起,需要透明背景的Alpha需要在边缘具有半透明的透明度,以达到这一目的,因为你无法知道背景是什么。 – Lorien
是的,格式文件是.png。我从互联网上拿走了它。 http://www.pngmart.com/image/16212 – Wesley