Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I'm copying an image. (My actual code is resizing the image but that's not relevant to my question.) My code looks something like this.

Image src = ...
using (Image dest = new Bitmap(width, height))
    Graphics graph = Graphics.FromImage(dest);
    graph.InterpolationMode = InterpolationMode.HighQualityBicubic;
    graph.DrawImage(src, 0, 0, width, height);
    dest.Save(filename, saveFormat);

This seems to work great unless src is loaded from an image with transparencies (such as GIF) or an alpha channel (such as PNG).

How can I get DrawImage() to transfer the transparencies/alpha channel to the new image, and then keep them when I save the file?

The question is what is the value of saveFormat variable? It should be PixelFormat.Format32bppArgb (or another format with alpha channel handled). Try also: using (Image dest = new Bitmap(width, height, PixelFormat.Format32bppArgb)). – Lukasz M May 18, 2012 at 20:05 This seems to work for alpha channels, but not for GIF transparencies. saveFormat will vary depending on the format of the input file. If the input file does not support alpha channel, then it's safe to assume the image will not contain alpha channel pixels. – Jonathan Wood May 18, 2012 at 20:13 Thanks for a quick reply. In the meantime I've found an article about GIF transparency. Take a look at it: support.microsoft.com/kb/319061. I suppose that basically you just have to get the image's palette and set the color saved in the first index to a transparent one. – Lukasz M May 18, 2012 at 20:23

It is pretty unclear, there's a lot you didn't say. The biggest issue with transparency is that you can't see it. You skipped a couple of steps, you didn't explicitly specify the pixel format of your new bitmap, you didn't initialize it at all and you didn't say what output format you use. Some don't support transparency. So let's make a version that makes it crystal clear. From a PNG image that looks like this in paint.net:

Using this code

        using (var src = new Bitmap("c:/temp/trans.png"))
        using (var bmp = new Bitmap(100, 100, PixelFormat.Format32bppPArgb)) 
        using (var gr = Graphics.FromImage(bmp)) {
            gr.Clear(Color.Blue);
            gr.DrawImage(src, new Rectangle(0, 0, bmp.Width, bmp.Height));
            bmp.Save("c:/temp/result.png", ImageFormat.Png);

Produces this image:

You can clearly see the blue background so the transparency worked.

Well, my intent was to support whichever format matched the input file. I thought I was pretty specific. It's just that the code wasn't meant to support only one file type. Perhaps I need a bunch of code to handle each file type--I don't know. I did try specifying the PixelFormat as you have, but then it seemed like that was causing errors when the file type was GIF with transparency. And, in fact, some variations seemed to work fine with PNGs without specifying the PixelFormat. – Jonathan Wood May 19, 2012 at 1:42 @JonathanWood create a new bitmap with the old bitmap's width and height, and your new desired format. Preferably in a using statement, create a Graphics object FromImage(your new bitmap) and DrawImage(your old bitmap). – user1881400 Feb 20, 2016 at 16:10

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.