2009-11-15 10 views
11

Estoy escribiendo un pequeño cuadro de diálogo de inicio de sesión y he incrustado un banner en la parte superior del cuadro de diálogo por razones estéticas. Todo fue bien, excepto que, de manera predeterminada, WPF elimina el alias de toda la imagen, lo que hace que el texto contenido en él sea frustrante y borroso.Deshabilitar el antialiasing en una imagen de WPF

Después de un poco de búsqueda, las primeras páginas de resultados mostraron que es creencia común que anti aliasing no se puede deshabilitar en WPF. ¿Puede alguien confirmar o denegar esto?

Es un problema menor para mí: quitaré el texto de la imagen y en su lugar superpongo una etiqueta con el mismo texto en la parte superior de la imagen de fondo para lograr el mismo efecto (aunque debo admitir que es un poco molesto).

Gracias, Rob

+0

Otro modo (automático) para evitar la sub-pixeling: http://stackoverflow.com/a/16984921/2463642 – MaMazav

+0

Tenga en cuenta que el mismo problema se puede producir si la configuración de Windows DPI han sido modificados (por ejemplo, para utilizar el 125% o 150% de tamaño de fuente). Esto también dará como resultado que se subastructuren los mapas de bits, haciendo que las cosas se vean "divertidas" (o más bien, feas ...). Podríamos agregar una pregunta aparte sobre eso, ya que la respuesta/solución es muy similar. –

Respuesta

17

Por lo que yo sé, siempre lo hace WPF suavizado al escalar un mapa de bits. Sin embargo, debería poder lograr su objetivo evitando la escala de mapa de bits.

hay dos pasos:

  1. Set SnapsToDevicePixels="true" en la imagen
  2. Establecer un ScaleTransform en su imagen a escala de modo que un píxel dispositivo = un píxel de mapa de bits

Para calcular el ScaleTransform necesaria, calcular DPI de su pantalla como esta:

var DPI = Win32Functions.GetSystemMetrics(SM_CYICON)/SystemParameters.IconHeight * 96; 

y luego para el mapa de bits, haga:

var scale = bitmapDPI/DPI; 
var transform = new ScaleTransform(scale, scale); 

Esto hará que los píxeles de su mapa de bits que coincidir exactamente con los píxeles del dispositivo. WPF no estirará el mapa de bits, por lo que no debe haber anti-aliasing.

Si desea estirar su imagen en pantallas de alta DPI pero sin anti-aliasing (por ejemplo, el doble de todos los píxeles), simplemente estire el mapa de bits en su propio código utilizando el algoritmo que desee y utilice el anterior con el estirado mapa de bits

+0

Gracias Ray - ¡este comentario me ayudó MUCHO en realidad! Estaba usando un InteropBitmap como fuente de una imagen y siempre se lo estaba escalando para que se viera realmente feo (aunque el DPI de mapa de bits era 96, que es diferente al DPI de la pantalla). Agregar una ScaleTransform para "escalar hacia abajo" ayudó, ahora parece que debería. Bounty viene, pero debido a los límites de SO tengo que esperar 23 horas antes de dárselo. :) –

+0

Bounty dado según lo prometido. :) Mejoré tu respuesta un poco también al mismo tiempo. –

Cuestiones relacionadas