Set background color in Bitmap Image

17,852

Solution 1

Try PixelFormats.Default or PixelFormats.Bgra32 or PixelFormats.Rgb24 instead of PixelFormats.Pbgra32.

The P stands for pre-multiplied - the assumption is that each channel is pre-multiplied by alpha.

MSDN reference

Solution 2

Try this

Size size = new Size(surface.Width, surface.Height);

surface.Measure(size);
surface.Arrange(new Rect(size));

// Create a render bitmap and push the surface to it
RenderTargetBitmap renderBitmap =
    new RenderTargetBitmap((int)size.Width, (int)size.Height, 96d, 96d,
                           PixelFormats.Pbgra32);

DrawingVisual drawingVisual = new DrawingVisual();
using (DrawingContext drawingContext = drawingVisual.RenderOpen())
{
    VisualBrush visualBrush = new VisualBrush(surface);
    drawingContext.DrawRectangle(visualBrush, null, 
      new Rect(new Point(), new Size(size.Width, size.Height)));
}

renderBitmap.Render(drawingVisual);

// Create a file stream for saving image
using (FileStream outStream = new FileStream(filename, FileMode.Create))
{
    BmpBitmapEncoder encoder = new BmpBitmapEncoder();
    // push the rendered bitmap to it
    encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
    // save the data to the stream
    encoder.Save(outStream);
}
Share:
17,852
Ionică Bizău
Author by

Ionică Bizău

💻 Programmer ⚡️ Geek 🎹 Pianist & Organist 🚀 Learner 💡 Mentor 💫 Dreamer 🍏 Vegetarian 🙏 Jesus follower Website | GitHub | Twitter | PayPal Donations

Updated on June 16, 2022

Comments

  • Ionică Bizău
    Ionică Bizău almost 2 years

    I want to save my canvas to image. It works but background color is black. How I must add to change the color?

    I use this code:

    Size size = new Size(surface.Width, surface.Height);
    
    surface.Measure(size);
    surface.Arrange(new Rect(size));
    
    // Create a render bitmap and push the surface to it
    RenderTargetBitmap renderBitmap =
        new RenderTargetBitmap((int)size.Width, (int)size.Height, 96d, 96d,
                               PixelFormats.Pbgra32);
    renderBitmap.Render(surface);
    
    // Create a file stream for saving image
    using (FileStream outStream = new FileStream(filename, FileMode.Create))
    {
        BmpBitmapEncoder encoder = new BmpBitmapEncoder();
        // push the rendered bitmap to it
        encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
        // save the data to the stream
        encoder.Save(outStream);
    }