Rob
Rob

Reputation: 759

C#, how to make a picture background transparent?

I have a picturebox with a png in it. Yet even when I set the BackColor to Transparent, it is not transparent. Any ideas what might be wrong? :)

alt text

Thanks!

Upvotes: 2

Views: 47204

Answers (5)

Chagbert
Chagbert

Reputation: 758

You really have to draw it through code. Place a pictureBox on your form, set sizeMode and docking as you like. Then you may fire the following function on the pictureBox's PAINT event:

    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
        }
    }

This is my class that is referenced in the above function:

    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();
    }
}

Thanks. chagbert.

Upvotes: 2

comecme
comecme

Reputation: 6386

How did you create the background? Is that set by setting the Form.BackgroundImage? If that background (the paper like image) is a container control, the transparency should just work. However, If you are placing two PictureBox objects on top of eachother this doesn't work. The transparent area takes on the color of its parent object. If you have two PictureBox objects they both will have the Form as their parent. If this is your situation, it can be solved by setting the transparent image's Parent property to be the background image.

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

When changing the Parent property, the Location of the tranparentPictureBox will become relative to its new parent. You'd have to subtract the x and y coordinates of the background image from the transparent image. See my answer on A PictureBox Question for an example with a screen shot.

AFAIK, you can not set the Parent in the Designer, only in code. Therefore, the Designer will still not show a transparent image, but at runtime it should.

The same problem occurs if you place a transparent Label on top of a PictureBox object.

Upvotes: 0

Javed Akram
Javed Akram

Reputation: 15344

I have also faced the problem regarding transparent pictures.

you have to Draw it through code. See my question A PictureBox Problem

EDIT:

In paint event (Control containing Background Image) write this

  //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); 

Upvotes: 6

Rob
Rob

Reputation: 759

From what I learned I can't do it within a windows form, as it doesn't have layers for the images. So guess will have to make it as WPF. :)

Upvotes: 0

Hps
Hps

Reputation: 1177

Your PNG file should also have the transparent background. This is can be done while creating the image(png) files.

Upvotes: 3

Related Questions