我的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)
| 归档时间: |
|
| 查看次数: |
21753 次 |
| 最近记录: |