Проблемы с рендерингом текста в виде растровых изображений с использованием WPF

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

  •  06-07-2019
  •  | 
  •  

Вопрос

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

[Обновлять]

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top