WPF を使用してテキストをビットマップとしてレンダリングする際の問題

StackOverflow https://stackoverflow.com/questions/1614397

  •  06-07-2019
  •  | 
  •  

質問

WPF を使用して、WPF のテキストや画像などのコンテンツを jpg ファイルに動的にレンダリングするアプリケーションを開発しています。現在使用しているのは、 RenderTargetBitmap 仕事をするクラス。すべて期待通りに動作しますが、レンダリングされたフォントの品質はひどいものです。私はそれを理解しています RenderTargetBitmap ClearType ではなく、GrayScale アンチエイリアスを使用します。フォントが小さいとぼやけてしまいます。しかし、30 ポイントを超える大きなフォントを使用しているため、結果はまったく受け入れられません。この問題に対する何らかの回避策はありますか?

[アップデート]

私が使用しているコードを以下に示します。予想どおり、CompositionTarget の各 Rendering イベントで呼び出されます。

void CompositionTarget_Rendering(object sender, EventArgs e)
        {
            prefix = "";
            if (counter < 10)
            {
                prefix = "000";
            }
            else if (counter < 100)
            {
                prefix = "00";
            }
            else if (counter < 1000)
            {
                prefix = "0";
            }

            Size size = new Size(MainCanvas.Width, MainCanvas.Height);
            MainCanvas.Measure(size);
            MainCanvas.Arrange(new Rect(size));


            RenderTargetBitmap bmp = new RenderTargetBitmap(imgWidth, imgHeight, 96d, 96d, PixelFormats.Default);
            bmp.Render(MainCanvas);

            JpegBitmapEncoder encoder = new JpegBitmapEncoder();
            encoder.QualityLevel = 90;
            encoder.Frames.Add(BitmapFrame.Create(bmp));
            string file = basePath + prefix + counter.ToString() + "_testpic.jpg";
            using (Stream stm = File.Create(file))
            {
                encoder.Save(stm);
            }
            counter++;
        }

結果として得られる画像の例をいくつか示します。代替テキスト http://www.randomnoise.org/temp/testpic_v1.jpg 代替テキスト http://www.randomnoise.org/temp/testpic_v2.jpg

前もって感謝します。

役に立ちましたか?

解決 2

OK、ついに解決策を見つけました。グスタボ、あなたは正しい道を歩んでいた。問題は、ビットマップとしてレンダリングしようとしているメイン コンテナが、その親コン​​テナによって歪んでいることでした。解決策は、子を変形させるレイアウト エンジンを持たないメイン コンテナをキャンバスに追加することでした。まだもう少し実験する必要がありますが、非常に有望そうです。どうやら RenderTargetBitmap は歪んだフォントをまったく好まないようです。

他のヒント

これを試してください:

int height = (int)border.ActualHeight;
int width = (int)border.ActualWidth;
RenderTargetBitmap bmp = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
bmp.Render(border);

borderは、ビットマップとして保存しようとしているものです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top