1

我有一些方法可以将 System.Windows.Controls.Canvas Control 转换为 .png 图像并保存在目录中。我为某些 List <Canvas> 调用此函数,并在某个目录中获取所有图像。它工作正常,但有时此函数会随机生成一些空白图像,再次调用此函数也会完美地生成所有图像。这种故障背后的原因可能是什么?下面是函数

  public bool GenerateICards(Canvas surface)
        {
            bool retVal = false;
            try
            {
                // Save current canvas transform
                Transform transform = surface.LayoutTransform;
                // reset current transform (in case it is scaled or rotated)
                surface.LayoutTransform = null;

                // Get the size of canvas
                Size size = new Size(surface.Width, surface.Height);

                // Measure and arrange the surface
                // VERY IMPORTANT
                surface.Measure(size);
                surface.Arrange(new Rect(size));

                // Create a render bitmap and push the surface to it
                RenderTargetBitmap renderBitmap =
                  new RenderTargetBitmap(
                    (int)size.Width,
                    (int)size.Height,
                    96d,
                    96d,
                    PixelFormats.Pbgra32);
                renderBitmap.Render(surface);

                // Create a file stream for saving image
                using (FileStream outStream = new FileStream(SessionHelper.Path.PrintImage, FileMode.Create, FileAccess.Write, FileShare.None))
                {
                    // Use png encoder for our data
                    PngBitmapEncoder encoder = new PngBitmapEncoder();
                    // push the rendered bitmap to it
                    encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
                    // save the data to the stream
                    encoder.Save(outStream);
                }
                // Restore previously saved layout
                surface.LayoutTransform = transform;
                // i++;
                retVal = true;
            }
            //}
            catch (Exception)
            {
                ErrorLbl = "Error occured while generating temporary images.";
            }
            return retVal;
        }
4

1 回答 1

1

刚换

renderBitmap.Render(surface);

函数中的行(上述问题中的函数)

 Rect bounds = VisualTreeHelper.GetDescendantBounds(surface);
                DrawingVisual dv = new DrawingVisual();
                using (DrawingContext ctx = dv.RenderOpen())
                {
                    VisualBrush vb = new VisualBrush(surface);
                    ctx.DrawRectangle(vb, null, new Rect(new Point(), bounds.Size));
                }

                renderBitmap.Render(dv);

这解决了我的问题。有关详细信息,请查看:http: //blogs.msdn.com/b/jaimer/archive/2009/07/03/rendertargetbitmap-tips.aspx

此链接由 colinsmith提供(在问题的评论部分)。

于 2012-10-29T11:51:56.627 回答