Easiest way of saving wpf Image control to a file

前端 未结 2 1179
清歌不尽
清歌不尽 2020-12-03 01:59

I have a Image control inside my wpf application, which has a large image inside of it, but the control itself is only 60x150, this means it only shows a certain portion of

2条回答
  •  佛祖请我去吃肉
    2020-12-03 02:40

    You could use RenderTargetBitmap class and BitmapEncoder.

    Define these methods:

    void SaveToBmp(FrameworkElement visual, string fileName)
    {
        var encoder = new BmpBitmapEncoder();
        SaveUsingEncoder(visual, fileName, encoder);
    }
    
    void SaveToPng(FrameworkElement visual, string fileName)
    {
        var encoder = new PngBitmapEncoder();
        SaveUsingEncoder(visual, fileName, encoder);
    }
    
    // and so on for other encoders (if you want)
    
    
    void SaveUsingEncoder(FrameworkElement visual, string fileName, BitmapEncoder encoder)
    {
        RenderTargetBitmap bitmap = new RenderTargetBitmap((int)visual.ActualWidth, (int)visual.ActualHeight, 96, 96, PixelFormats.Pbgra32);
        bitmap.Render(visual);
        BitmapFrame frame = BitmapFrame.Create(bitmap);
        encoder.Frames.Add(frame);
    
        using (var stream = File.Create(fileName))
        {
            encoder.Save(stream);
        }
    }
    

    If you have your Image control inside a container like this:

    
        
    
    

    You just need to do so:

    SaveToPng(MyGrid, "image.png");
    

    Otherwise you can simply pass the dimensions you want when you use RenderTargetBitmap:

    SaveToPng(MyImage, "image.png");
    
    ...
    
    RenderTargetBitmap bitmap = new RenderTargetBitmap(YourWidth, YourHeight, 96, 96, PixelFormats.Pbgra32);
    

提交回复
热议问题