将wpf图像控件保存到文件的最简单方法

Meh*_*Meh 12 wpf imaging save

我的wpf应用程序中有一个Image控件,里面有一个大图像,但控件本身只有60x150,这意味着它只显示该图像的某个部分.将可见部分保存到文件的最简单方法是什么?

谢谢您的帮助.

[编辑]我最终使用的是此处找到的代码(在发布此处之前我无法找到)...

Grid r = new Grid();
        r.Background = new ImageBrush(image2.Source);


    System.Windows.Size sz = new System.Windows.Size(image2.Source.Width, image2.Source.Height);
    r.Measure(sz);
    r.Arrange(new Rect(sz));

    RenderTargetBitmap rtb = new RenderTargetBitmap((int)image2.Source.Width, (int)image2.Source.Height, 96d, 96d, PixelFormats.Default);
    rtb.Render(r);

    BmpBitmapEncoder encoder = new BmpBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(rtb));

    FileStream fs = File.Open(@"C:\lol.png", FileMode.Create);
    encoder.Save(fs);
    fs.Close();
Run Code Online (Sandbox Code Playgroud)

gli*_*ite 16

您可以使用RenderTargetBitmap类和BitmapEncoder.

定义这些方法:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您将Image控件放在容器中,如下所示:

<Grid x:Name="MyGrid">
    <Image Name="MyImage" Stretch="None"></Image>
</Grid>
Run Code Online (Sandbox Code Playgroud)

你只需要这样做:

SaveToPng(MyGrid, "image.png");
Run Code Online (Sandbox Code Playgroud)

否则,您只需在使用RenderTargetBitmap时传递所需的尺寸:

SaveToPng(MyImage, "image.png");

...

RenderTargetBitmap bitmap = new RenderTargetBitmap(YourWidth, YourHeight, 96, 96, PixelFormats.Pbgra32);
Run Code Online (Sandbox Code Playgroud)

  • 多亏了这一点,如果不是一个小问题就太棒了..保存的图像是黑色的......任何想法是如何发生的或如何解决它? (4认同)
  • @Capt.Morgan,我知道这是旧的,但我遇到了同样的问题,您需要将渲染控件放置在没有边距的父控件上,如下所述:http://weblog.west-wind.com/posts/ 2007/Sep/10/Rendering-a-WPF-Container-to-Bitmap (2认同)