C#,如何让图片背景透明?

时间:2010-12-11 13:29:33

标签: c#

我有一个带有png的图片框。即使我将BackColor设置为Transparent,它也不透明。什么想法可能是错的? :)

alt text

谢谢!

5 个答案:

答案 0 :(得分:5)

我也遇到过有关透明照片的问题。

你必须通过代码绘制它。       请参阅我的问题A PictureBox Problem

修改

绘制事件(包含背景图像的控件)中 写这个

  //If added your image in project's resources get from there OR your Image location
  Image img = yourNamespace.Properties.Resources.yourPicture;   
  e.Graphics.DrawImage(img,50,50,100,100); 

答案 1 :(得分:3)

您的PNG文件也应具有透明背景。这可以在创建图像(png)文件时完成。

答案 2 :(得分:1)

你真的必须通过代码绘制它。在您的表单上放置一个pictureBox,设置sizeMode并根据需要对接。然后你可以在pictureBox的PAINT事件上激活以下函数:

    public void LogoDrawTransparent(PaintEventArgs e)
    {
        // Create a Bitmap object from an image file.
        Image myImg;
        Bitmap myBitmap;
        try
        {
            myImg = cls_convertImagesByte.GetImageFromByte(newImg);
            myBitmap = new Bitmap(myImg); // @"C:\Temp\imgSwacaa.jpg");  

            // Get the color of a background pixel.
            Color backColor = myBitmap.GetPixel(0, 0); // GetPixel(1, 1); 
            Color backColorGray = Color.Gray;
            Color backColorGrayLight = Color.LightGray;
            Color backColorWhiteSmoke = Color.WhiteSmoke;
            Color backColorWhite = Color.White;
            Color backColorWheat = Color.Wheat;

            // Make backColor transparent for myBitmap.
            myBitmap.MakeTransparent(backColor);
                    // OPTIONALLY, you may make any other "suspicious" back color transparent (usually gray, light gray or whitesmoke)
            myBitmap.MakeTransparent(backColorGray);
            myBitmap.MakeTransparent(backColorGrayLight);
            myBitmap.MakeTransparent(backColorWhiteSmoke);

            // Draw myBitmap to the screen.
            e.Graphics.DrawImage(myBitmap, 0, 0, pictureBox1.Width, pictureBox1.Height); //myBitmap.Width, myBitmap.Height);
        }
        catch
        {
            try { pictureBox1.Image = cls_convertImagesByte.GetImageFromByte(newImg); }
            catch { } //must do something
        }
    }

这是我在上面的函数中引用的类:

    class cls_convertImagesByte
{

    public static Image GetImageFromByte(byte[] byteArrayIn)
    {
        MemoryStream ms = new MemoryStream(byteArrayIn);
        Image returnImage = Image.FromStream(ms);
        return returnImage;
    }

    public static byte[] GetByteArrayFromImage(System.Drawing.Image imageIn)
    {
        MemoryStream ms = new MemoryStream();
        imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
        return ms.ToArray();
    }
}

感谢。 chagbert。

答案 3 :(得分:0)

你是如何创建背景的?是通过设置Form.BackgroundImage设置的吗? 如果那个背景(纸张像图像)是一个容器控件,那么透明度应该可行。 但是,如果要将两个PictureBox对象放在彼此的顶部,则这不起作用。透明区域采用其父对象的颜色。如果您有两个PictureBox个对象,则他们都将Form作为其父级。如果这是您的情况,可以通过将透明图像的Parent属性设置为背景图像来解决。

    private void Form1_Load(object sender, EventArgs e)
    {
        transparentPictureBox.Parent = backgroundPictureBox;
    }

更改Parent属性时,Location的{​​{1}}将相对于其新父级。您必须从透明图像中减去背景图像的x和y坐标。有关屏幕截图的示例,请参阅A PictureBox Question上的答案。

AFAIK,您不能仅在代码中在Designer中设置tranparentPictureBox。因此,Designer仍然显示透明图像,但在运行时它应该。

如果您在Parent对象的顶部放置透明Label,则会出现同样的问题。

答案 4 :(得分:-1)

从我学到的东西,我无法在Windows窗体中执行,因为它没有图像的图层。所以猜测必须把它作为WPF。 :)