2015-02-17 2 views
0

У меня есть движок рендеринга графического процессора, который создает текстуры. Эти текстуры копируются в WriteableBitmap. Этот битмап используется в качестве источника изображения в обычном представлении Windows Presentation Foundation.Wpf Dpi и пиксель-идеальный WritableBitmap

Теперь я установил, что мой dpi равен 120, то есть я включил 125% размер шрифта в панели управления Windows.

С этого изменения WritableBitmap выглядит действительно уродливо. Он больше не идеален для пикселей и выглядит плохо сглаженным (вероятно, потому, что Wpf растягивает его как-то).

Я играл со следующими параметрами:

  • This answer описывает, как получить ДОИ от МОФ, и я настроил значения WritableBitmap точек на дюйм и ширина/высота соответственно.
  • Отключить UseLayoutПрименить и включить SnapToDevicePixels в XAML, который содержит изображение.

Но я не могу заставить его выглядеть хорошо. Я не уверен, что понимаю, что именно я должен установить для каких значений, чтобы получить идеальный пиксель. Кажется, что есть несколько настроек, которые зависят друг от друга.

Хороший ответ объясняет, каким образом настройки должны быть установлены в комбинациях так, чтобы они работали должным образом.

+0

Лучше один раз [посмотреть] (http://stackoverflow.com/help/mcve), чем 10 раз услышать. – Sinatr

+0

Помогает ли последний параграф этой статьи? https://msdn.microsoft.com/en-us/library/windows/desktop/ee308410%28v=vs.85%29.aspx –

+0

и вы проверили эту статью - http://blogs.msdn.com/ b/patricka/archive/2010/04/15/why-do-a-high-dpi-setting-make-my-application-look-fuzzy-and-have-clipped-text.aspx – AwkwardCoder

ответ

0

В xaml установите для параметра SnapsToDevicePixels значение true.

В классе, который устанавливает WritableBitmap, запрашивает ActualWidth и ActualHeight. Затем умножьте значения с коэффициентами шкалы от Dpi (1,25 для dpi 120 и т. Д.).

var width = ActualWidth * _dpi_x_scale; 
var height = ActualHeight * _dpi_y_scale; 

Я использую эти значения ширины и высоты, чтобы задать размер текстуры рендеринга на Gpu.

При создании WritableBitmap, а также использовать те масштабируется ширина/высота, но убедитесь, чтобы установить правильный DPI:

_bitmap = new WriteableBitmap(
      width, 
      height, 
      _dpi_x, 
      _dpi_y, 
      PixelFormats.Pbgra32, 
      null 
      ); 

Это решает проблему.

+0

Но как получить dpi? – Exerion