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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With