C# 给一个图片盒一个图像的形状

C# 给一个图片盒一个图像的形状,c#,winforms,transparency,picturebox,shape,C#,Winforms,Transparency,Picturebox,Shape,我想给一个图片盒一个图像的形状,我有。偏离路线的图像是矩形的,但是背景色应该被忽略,这导致了所需的形式。因此,如果有一张白色背景上的香蕉图片,我应该在最后有一个香蕉形状的图片盒。。这是必要的,这样我就可以在AxWMPLib Mediaplayer前面移动成型的PictureBox,而不必让香蕉周围的矩形覆盖整个视频 我的方法是创建一个扩展PictureBox的新类,然后将区域设置为形状。问题是,我不知道如何得到形状 class ShapedPBox : PictureBox { publ

我想给一个图片盒一个图像的形状,我有。偏离路线的图像是矩形的,但是背景色应该被忽略,这导致了所需的形式。因此,如果有一张白色背景上的香蕉图片,我应该在最后有一个香蕉形状的图片盒。。这是必要的,这样我就可以在AxWMPLib Mediaplayer前面移动成型的PictureBox,而不必让香蕉周围的矩形覆盖整个视频

我的方法是创建一个扩展PictureBox的新类,然后将区域设置为形状。问题是,我不知道如何得到形状

class ShapedPBox : PictureBox
{
    public ShapedPBox()
    {
         this.Paint += this.shapedPaint;
    }

    void shapedPaint(object sender, paintEventArgs e)
    {
        System.Drawing.Drawing2D.GraphicsPath gP = new System.Drawing.Drawing2D.GraphicsPath();
        //do something to give gP.addPicture? perhaps something with transparency key?

        this.Region = new Region(graphicsPath);
    }
    public Image image;
}
您可以将PictureBox的SizeMode属性设置为StretchImage,这将删除默认背景色。当然,图像会根据图像和控制大小而缩小或增大

如果您无法调整图像大小,并且知道背景在哪里,则可以使用以下代码。它所做的只是从图像边缘获取颜色,并将其设置为图片框的背景色

Image image = Image.FromFile(@"c:\Image.png");
Bitmap bitmap = new Bitmap(image);
pictureBox1.BackColor = bitmap.GetPixel(0, 1);
pictureBox1.Image = image;

这是您控制的图片还是您完全不知道图片的内容?视情况而定。如果后面有其他控件或您移动了它,则会出现问题。但是,如果只有没有移动的窗体,则BackColor=transparent并正常加载图像。您需要用于命中测试的GraphicsPath。1。这幅画我不知道。。2.是的,还有其他控件在它后面移动,它本身也会移动。这就是为什么BackColor=Color.Transparent不起作用的原因。一个简单的答案,你做不到。这是一个复杂的问题,你需要很多技巧,包括获取dc和自己绘制背景。这显然不是标记的副本。真正的问题是如何将图像中的形状提取到图形中。太宽了,-但是你在哪里/如何调整图片盒的形状呢?我们没有。你为什么要改变形状?只需将背景色设置为图像的背景色,它就会显示为无缝集成。如果要更改图像的背景以与窗体的背景匹配,这将涉及大量的图像处理。我需要调整picturebox的形状,因为我希望能够定位很多picturebox和其他控件,使它们不会用矩形相互覆盖。这只是锚定和对接工作。看看这些属性和TableLayoutControl。当涉及到复杂的布局时,这个控件非常棒。我毫不怀疑它能在AxWMPLib Mediaplayer上与上述香蕉或类似产品一起工作,是吗?