Проблемы с отображением текста как растровых изображений с использованием WPF - PullRequest
1 голос
/ 23 октября 2009

Я разрабатываю приложение, использующее WPF для динамического рендеринга содержимого, включая текст и изображения из WPF, в файлы jpg. В настоящее время я использую класс RenderTargetBitmap, чтобы сделать работу. Все работает как положено, но качество отображаемых шрифтов ужасно. Я понимаю, что RenderTargetBitmap использует не ClearType, а сглаживание GrayScale, которое выглядит нечетко с мелкими шрифтами. Но я использую большие шрифты размером больше 30, и результаты совершенно неприемлемы. Есть ли какое-то решение этой проблемы?

[Update]

Код, который я использую, указан ниже. Как и ожидалось, он вызывается для каждого события рендеринга 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++;
        }

Вот несколько примеров полученных изображений: альтернативный текст http://www.randomnoise.org/temp/testpic_v1.jpg альтернативный текст http://www.randomnoise.org/temp/testpic_v2.jpg

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 29 октября 2009

Хорошо, я наконец нашел решение. Густаво, ты был на правильном пути. Проблема заключалась в том, что основной контейнер, который я пытался отобразить как растровое изображение, искажался его родительским контейнером. Решение состояло в том, чтобы добавить основной контейнер к холсту, у которого нет механизма компоновки, который искажает его дочерние элементы. Мне все еще нужно провести еще несколько экспериментов, но это выглядит очень многообещающе. Очевидно, RenderTargetBitmap вообще не любит искаженные шрифты.

0 голосов
/ 23 октября 2009

Попробуйте это:

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

Граница - это то, что вы пытаетесь сохранить как растровое изображение.

...