WPF アプリケーションでは、そのようなことを行うための望ましい方法は何ですか? 1000 x 1000 サイズのグリッドがある場合、たとえば 200 x 200 サイズの画像として保存するにはどうすればよいですか??
ありがとう!
以下の回答を少し修正して、このシナリオでうまくいくようにしました
。Slice Large WPF Canvas Into Many Small PNG Images
このように呼びます
SaveFrameworkElementToPng(myGrid, 200, 200, "MyImage.png");
SaveFrameworkElementToPng
private void SaveFrameworkElementToPng(FrameworkElement frameworkElement,
int width,
int height,
string filePath)
{
BitmapImage bitmapImage = VisualToBitmapImage(frameworkElement);
SaveImage(bitmapImage, width, height, filePath);
}
public BitmapImage VisualToBitmapImage(FrameworkElement frameworkElement)
{
RenderTargetBitmap rtb = new RenderTargetBitmap((int)frameworkElement.ActualWidth,
(int)frameworkElement.ActualHeight,
96d,
96d,
PixelFormats.Default);
rtb.Render(frameworkElement);
MemoryStream stream = new MemoryStream();
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(rtb));
encoder.Save(stream);
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = stream;
bitmapImage.EndInit();
return bitmapImage;
}
public void SaveImage(BitmapImage sourceImage,
int width,
int height,
string filePath)
{
TransformGroup transformGroup = new TransformGroup();
ScaleTransform scaleTransform = new ScaleTransform();
scaleTransform.ScaleX = (double)width / sourceImage.PixelWidth;
scaleTransform.ScaleY = (double)height / sourceImage.PixelHeight;
transformGroup.Children.Add(scaleTransform);
DrawingVisual vis = new DrawingVisual();
DrawingContext cont = vis.RenderOpen();
cont.PushTransform(transformGroup);
cont.DrawImage(sourceImage, new Rect(new Size(sourceImage.PixelWidth, sourceImage.PixelHeight)));
cont.Close();
RenderTargetBitmap rtb = new RenderTargetBitmap(width, height, 96d, 96d, PixelFormats.Default);
rtb.Render(vis);
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(rtb));
using (FileStream stream = new FileStream(filePath, FileMode.Create))
{
encoder.Save(stream);
stream.Close();
}
}