Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Replacing transparent background with white color in PNG images

I have a PNG image being sent from a DrawingView in Android to a WCF service. The image is sent as a 32-bit and it has transparent background. I want to replace the transparent colour (for lack of a better word) background with white. So far my code looks like this:

// Converting image to Bitmap object
Bitmap i = new Bitmap(new MemoryStream(Convert.FromBase64String(image)));
// The image that is send from the tablet is 1280x692
// So we need to crop it
Rectangle cropRect = new Rectangle(640, 0, 640, 692);
//HERE
Bitmap target = i.Clone(cropRect, i.PixelFormat);
target.Save(string.Format("c:\\images\\{0}.png", randomFileName()),
System.Drawing.Imaging.ImageFormat.Png);

The above works fine, except the images have transparent background. I noticed that in Paint.NET you can simply set the PNG format to 8-bit and it sets the background to white. However, when I tried using:

System.Drawing.Imaging.PixelFormat.Format8bppIndexed

all I got was a completely black picture.

Q: How to replace the transparent background with white in a png?

PS. The image is in Gray Scale.

like image 380
Dawid O Avatar asked Dec 05 '14 14:12

Dawid O


1 Answers

This will draw onto a given color:

Bitmap Transparent2Color(Bitmap bmp1, Color target)
{
    Bitmap bmp2 = new Bitmap(bmp1.Width, bmp1.Height);
    Rectangle rect = new Rectangle(Point.Empty, bmp1.Size);
    using (Graphics G = Graphics.FromImage(bmp2) )
    {
        G.Clear(target);
        G.DrawImageUnscaledAndClipped(bmp1, rect);
    }
    return bmp2;
}

This makes use of the G.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;, which is the default. It blends the drawn image with the background according to the alpha channel of the drawn image.

like image 79
TaW Avatar answered Sep 23 '22 12:09

TaW