2009-10-23 2 views
1

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

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

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

Спасибо заранее.

+0

Можете ли вы разместить фотографию? –

+0

Какое разрешение ваших растровых изображений? – ChrisF

+0

Пожалуйста, разместите код, в котором вы используете RenderTargetBitmap. Какие PixelFormats вы используете? –

ответ

0

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

0

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

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

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

+0

Спасибо за подсказку. ActualHeigth и ActualWidth имеют смысл. К сожалению, в этом случае это не имеет значения. –

+0

И вы используете 96, 96 правильно? –