1

WPF アプリケーションでは、そのようなことを行うための望ましい方法は何ですか? 1000 x 1000 サイズのグリッドがある場合、たとえば 200 x 200 サイズの画像として保存するにはどうすればよいですか??

ありがとう!

4

1 に答える 1

0

以下の回答を少し修正して、このシナリオでうまくいくようにしました
。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();
    }
}
于 2012-06-10T14:41:52.447 に答える