Expand canvas/transparent background in BitmapImage in a WPF app

后端 未结 3 2074
无人及你
无人及你 2021-02-09 13:23

This is a follow up question on Save image to file keeping aspect ration in a WPF app

I know howto scale the image, but how do I expand the canvas size, to ensure the im

3条回答
  •  清歌不尽
    2021-02-09 13:49

    CroppedBitmap doesn't seem to support adding space around an image so instead you can create a transparent image the correct size using WriteableBitmap. If the input is smaller than the target size this method will enlarge it, but that is easy to alter.

    public static BitmapSource FitImage(BitmapSource input, int width, int height)
    {
        if (input.PixelWidth == width && input.PixelHeight == height)
            return input;
    
        if(input.Format != PixelFormats.Bgra32 || input.Format != PixelFormats.Pbgra32)
            input = new FormatConvertedBitmap(input, PixelFormats.Bgra32, null, 0);
    
        //Use the same scale for x and y to keep aspect ratio.
        double scale = Math.Min((double)width / input.PixelWidth, height / (double)input.PixelHeight);
    
        int x = (int)Math.Round((width - (input.PixelWidth * scale))/2);
        int y = (int)Math.Round((height - (input.PixelHeight * scale))/2);
    
    
        var scaled = new TransformedBitmap(input, new ScaleTransform(scale, scale));
        var stride = scaled.PixelWidth * (scaled.Format.BitsPerPixel / 8);
    
        var result = new WriteableBitmap(width, height, input.DpiX, input.DpiY, input.Format,null);
    
        var data = new byte[scaled.PixelHeight * stride];
        scaled.CopyPixels(data, stride, 0);
        result.WritePixels(new Int32Rect(0,0,scaled.PixelWidth,scaled.PixelHeight), data, stride,x,y);
        return result;
    }
    

    If you are already rendering content using RenderTargetBitmap you could wrap it in a ViewBox to do the scaling but if you're just working with normal images I'd use the above method.

提交回复
热议问题