Pregunta

Estoy desarrollando una aplicación que usa WPF para renderizar dinámicamente contenido, incluyendo texto e imágenes de WPF en archivos jpg. Actualmente estoy usando la clase RenderTargetBitmap para hacer el trabajo. Todo funciona como se esperaba, pero la calidad de las fuentes renderizadas es terrible. Entiendo que RenderTargetBitmap no utiliza el ClearType sino un antialias GrayScale, que es un poco confuso con las fuentes pequeñas. Pero estoy usando fuentes grandes, más de 30 puntos, y los resultados son totalmente inaceptables. ¿Hay algún tipo de solución para este problema?

[Actualización]

El código que estoy usando se encuentra a continuación. Como se esperaba, se invoca en cada evento de representación de 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++;
        }

Aquí hay algunos ejemplos de las imágenes resultantes: texto alternativo http://www.randomnoise.org/temp/testpic_v1.jpg texto alternativo http://www.randomnoise.org/temp/testpic_v2.jpg

Gracias de antemano.

¿Fue útil?

Solución 2

Ok, finalmente encontré una solución. Gustavo estabas en el camino correcto. El problema era que el contenedor principal que estaba intentando representar como mapa de bits estaba distorsionado por su contenedor principal. La solución fue agregar el contenedor principal a un lienzo, que no tiene un motor de diseño que distorsione a sus hijos. Todavía necesito hacer más experimentos pero parece muy prometedor. Al parecer, a RenderTargetBitmap no le gustan las fuentes distorsionadas en absoluto.

Otros consejos

Prueba esto:

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

siendo el borde lo que estás intentando guardar como mapa de bits.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top