【问题标题】:How to capture a Grid to image file with different size?如何将网格捕获到不同大小的图像文件?
【发布时间】:2012-06-11 16:46:10
【问题描述】:

在 WPF 应用程序中,最好的方法是什么? 如果我有一个 1000 x 1000 大小的网格,我该如何将其保存为 200 x 200 大小的图像??

谢谢!

【问题讨论】:

    标签: .net wpf c#-4.0


    【解决方案1】:

    在下面修改了我的答案,使其适用于这种情况
    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();
        }
    }
    

    【讨论】:

    • @Samir Sabri:我的建议好运吗?还是我误解了你的问题?
    • 是的,它成功了,但是在性能方面它很慢,谢谢Meleak
    • @Samir Sabri:好的,我从来没有真正检查过它的性能。现在试了一下,它似乎能够在大约一秒钟内保存一个简单的Grid 4 行 100 次。我想这取决于你需要它。
    • 请问您测试过的网格大小是多少?
    • 这是默认大小。我将其增加到 1000x1000,大约需要 8 秒。你的结果是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多