1

我是 wpf 开发的新手。我已经在运行时动态地在画布中添加了一个图像,并且我正在尝试将该图像容器(即画布)保存为 png 图像。但我没有正确获得输出图像。我得到一个空白的png图像。谁能告诉我的代码逻辑有什么问题。

代码

private void CreateSaveBitmap1(string filename, Rect rect)
{
    System.Windows.Controls.Image bg = new System.Windows.Controls.Image();
    bg.Source = new BitmapImage(new Uri(filename, UriKind.Relative));


    Canvas imageCan = new Canvas();
    imageCan.Height = 800;
    imageCan.Width = 1000;

    Canvas.SetLeft(bg, 0);
    Canvas.SetTop(bg, 0);

    bg.RenderTransform = trGrp; //trGrp is the TransformGroup object.


    RenderTargetBitmap rtb = new RenderTargetBitmap((int)imageCan.Width, (int)imageCan.Height, 96d, 96d, System.Windows.Media.PixelFormats.Default);
    rtb.Render(imageCan);


    //var crop = new CroppedBitmap(rtb, new Int32Rect((int)rect.X, (int)rect.Y, (int)rect.Width, (int)rect.Height));            

    BitmapEncoder pngEncoder = new PngBitmapEncoder();
    pngEncoder.Frames.Add(BitmapFrame.Create(rtb));

    using (var fs = System.IO.File.OpenWrite(@"D:\test\nowTest.png"))
    {
        pngEncoder.Save(fs);
    }
}
4

3 回答 3

1

您应该通过调用UpdateLayoutInvalidateVisual来强制画布的初始布局:

imageCan.UpdateLayout();

RenderTargetBitmap rtb = ...
rtb.Render(imageCan);

并且可能需要通过设置BitmapCacheOption.OnLoad来强制立即加载图像:

var image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = new Uri(filename, UriKind.Relative);
image.EndInit();
bg.Source = image;
于 2013-01-03T13:34:23.987 回答
0

我有过类似的问题。
它不仅会影响 RenderTargetBitmap,还会影响 XPS 和 PDF 输出。不幸的是,真正对我有用的唯一方法有点难看:
我必须将它添加到可视化树中并调用更新布局。

这意味着我在窗口某处有一个画布,添加了它,称为 UpdateLayout,创建了导出并随后将其删除

其他一切(例如克莱门斯所说的)都行不通。所以这个解决方案非常难看,但至少它以某种方式起作用。

于 2013-09-30T11:01:44.583 回答
0

您应该更新画布布局

使用 UpdateLayout 方法:MyCanvas.UpdateLayout();

另外,您应该检查画布高度和风度必须大于 0;

th

于 2014-01-29T17:27:04.793 回答