Expand canvas/transparent background in BitmapImage in a WPF app

后端 未结 3 2071
无人及你
无人及你 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.

    0 讨论(0)
  • 2021-02-09 13:55

    Just some code in case others are trying to postprocess files from a form upload.

    if (file.PostedFile != null)
    {
        //write the new file to disk
        string cachePath = String.Format("{0}temp\\", Request.PhysicalApplicationPath);
        string photoPath = String.Format("{0}temp.png", cachePath);                
        if (!Directory.Exists(cachePath))
    {
       Directory.CreateDirectory(cachePath);
    }    
    
    file.PostedFile.SaveAs(photoPath);
    
    //resize the new file and save it to disk               
    BitmapSource banana = FitImage(ReadBitmapFrame(file.PostedFile.InputStream), 640, 480);
    PngBitmapEncoder encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(banana));
    FileStream pngStream = new FileStream(cachePath + "test.png", FileMode.Create);
    encoder.Save(pngStream);
    pngStream.Close();
    
    //set a couple images on page to the newly uploaded and newly processed files
    image.Src = "temp/temp.png";
    image.Visible = true;
    image2.Src = "temp/test.png"; 
    
    
       image2.Visible = true;
    }
    
    0 讨论(0)
  • 2021-02-09 14:00

    You should be able to set the Stretch property to Uniform.

    0 讨论(0)
提交回复
热议问题