2017-04-12 39 views
2

我试图将窗体窗体转换为透明窗体,并使其只显示一个对象。但它仍然在我的物体周围有一条线(中风),它并不是我想要的那么完美。我如何取出线(中风)? (附照片比较。)从透明窗体上的图像中删除轮廓

enter image description here

这里是我的代码:

private void Form1_Load(object sender, EventArgs e) 
{ 
    this.FormBorderStyle = FormBorderStyle.None; 
    this.Width = this.pictureBox1.Width; 
    this.Height = this.pictureBox1.Height; 
    SetStyle(ControlStyles.SupportsTransparentBackColor, true); 
    this.BackColor = Color.Black; 
    this.TransparencyKey = this.pictureBox1.BackColor; 
} 
+1

很确定这与图像有关,而不是代码,图像本身的轮廓 –

+0

您可以发布有关图像格式的细节吗?所以我们可以知道它是否支持alpha通道,这可能是这张图片边缘问题最可能的原因,没有像png文件那样的适当的alpha通道。消除锯齿将永远不会正确渲染。反锯齿就是你需要在背景透明的情况下将曲面边缘与背景混合在一起,需要透明背景的Alpha需要在边缘具有半透明的透明度,以达到这一目的,因为你无法知道背景是什么。 – Lorien

+0

是的,格式文件是.png。我从互联网上拿走了它。 http://www.pngmart.com/image/16212 – Wesley

回答

1

您的图像具有半透明像素。 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通常会有。

最后请注意,由于图像有lotBlack您应该选择不同的颜色。 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

+0

仍然不行。我甚至尝试了透明的圆形,而且没有任何变化。 :( – Wesley

+0

如果你不介意,你可以在c#中快速创建一个,然后发给我那个文件?所以我可以看到它,谢谢。 – Wesley

+0

请参阅我的更新! – TaW

0

使用PNG图像实现的具有透明背景
设置您的控制/表格背景色和透明按键颜色这在图像中不存在

+0

我做到了,但这是同样的问题。没有改变。 – Wesley