Pergunta

Estou desenvolvendo um aplicativo usando WPF para renderizar dinamicamente o conteúdo, incluindo texto e imagens de WPF em arquivos JPG. Atualmente, estou usando a classe RenderTargetBitmap para fazer o trabalho. Tudo funciona como esperado, mas a qualidade das fontes prestados é terrível. Eu entendo que a RenderTargetBitmap não usa o ClearType, mas um antialias em tons de cinza, que é tipo de blury com fontes pequenas. Mas eu estou usando fontes grandes, maiores de 30 pts, e os resultados são totalmente inaceitáveis. Existe algum tipo de solução para este problema?

[Update]

O código que estou usando é listado abaixo. Como esperado é chamado em cada evento Rendering do CompositionTarget.

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++;
        }

Aqui estão alguns exemplos das imagens resultantes: alt texto http://www.randomnoise.org/temp/testpic_v1.jpg texto alt http://www.randomnoise.org/temp/testpic_v2.jpg

Agradecemos antecipadamente.

Foi útil?

Solução 2

Ok, eu finalmente encontrei uma solução. Gustavo você estava no caminho certo. O problema era que o contêiner principal que eu estava tentando processar como bitmap estava sendo distorcido por seu contêiner-pai. A solução foi adicionar o recipiente principal para uma tela, que não tem um mecanismo de layout que distorce seus filhos. Eu ainda preciso fazer mais algumas experiências, mas parece muito promissor. Aparentemente RenderTargetBitmap não gosta fontes distorcidas em tudo.

Outras dicas

Tente isto:

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

fronteira sendo o que você está tentando salvar o bitmap.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top