Copy image with alpha channel to clipboard with custom background color?

后端 未结 2 1436
一整个雨季
一整个雨季 2021-01-13 04:09

Code :

private void Foo(Canvas canvas)
{
    // The content is a bit larger...
    Size size = new Size(canvas.ActualWidth * 1.1, canvas.Act         


        
相关标签:
2条回答
  • 2021-01-13 04:23

    Here's my last solution, hope it would help others with the same problem

    // 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 white background render bitmap
    int dWidth = (int)size.Width;
    int dHeight = (int)size.Height;
    int dStride = dWidth * 4;
    byte[] pixels = new byte[dHeight * dStride];
    for (int i = 0; i < pixels.Length; i++)
    {
        pixels[i] = 0xFF;
    }
    BitmapSource bg = BitmapSource.Create(
        dWidth,
        dHeight,
        96,
        96,
        PixelFormats.Pbgra32,
        null,
        pixels,
        dStride
    );
    
    // Adding those two render bitmap to the same drawing visual
    DrawingVisual dv = new DrawingVisual();
    DrawingContext dc = dv.RenderOpen();
    dc.DrawImage(bg, new Rect(size));
    dc.DrawImage(renderBitmap, new Rect(size));
    dc.Close();
    
    // Render the result
    RenderTargetBitmap resultBitmap =
        new RenderTargetBitmap(
        (int)size.Width,
        (int)size.Height,
        96d,
        96d,
        PixelFormats.Pbgra32
    );
    resultBitmap.Render(dv);
    
    // Copy it to clipboard
    try
    {
        Clipboard.SetImage(resultBitmap);
    } catch { ... }
    
    0 讨论(0)
  • 2021-01-13 04:29

    I have found a smaller and better-to-read solution, I found it at https://social.msdn.microsoft.com/Forums/vstudio/en-US/a6972b7f-5ccb-422d-b203-134ef9f10084/how-to-capture-entire-usercontrol-image-to-clipboard?forum=wpf :

    // Create a render bitmap and push the surface to it
    RenderTargetBitmap renderBitmap =
        new RenderTargetBitmap(
        (int)size.Width,
        (int)size.Height,
        96d,
        96d,
        PixelFormats.Pbgra32
    );
    
    // Render a white background into buffer for clipboard to avoid black background on some elements
    Rectangle vRect = new Rectangle()
    {
        Width = (int)size.Width,
        Height = (int)size.Height,
        Fill = Brushes.White,
    };
    vRect.Arrange(new Rect(size));
    renderBitmap.Render(vRect);
    
    // renderBitmap is now white, so render your object on it
    renderBitmap.Render(surface);
    
    // Copy it to clipboard
    try
    {
        Clipboard.SetImage(resultBitmap);
    } catch { ... }
    
    0 讨论(0)
提交回复
热议问题