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

UpdateLayoutを呼び出すか、InvalidateVisualを呼び出して、キャンバスの初期レイアウトを強制する必要があります。

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 に答える