2010-06-03 18 views
5

Estoy usando WPF para una canalización de cambio de tamaño de imagen que ha estado funcionando muy bien en .NET v3.5. Acabo de actualizar el proyecto para apuntar a v4.0 y ahora todas mis imágenes redimensionadas tienen un gran alias. Ninguno del código de la tubería de imagen ha cambiado.Image Resize Aliasing en WPF v4 pero no en v3.5

  1. ¿Ha cambiado la configuración predeterminada de WPF entre v3.5 y v4.0?

  2. ¿Cómo controlo el tramado de mis imágenes de mapa de bits redimensionadas en WPF?

estoy usando BitmapImage, DrawingVisual, DrawingContext, RenderTargetBitmap, BitmapEncoder, y BitmapFrame pero no estoy viendo propiedades relacionadas con tramado. GDI + tenía muchos ajustes, así que supongo que me falta algo.

Actualización: Parece que todas las soluciones que he visto asumen un objeto de ventana o un entorno XAML. Esto se ejecuta dentro de un servicio de Windows que no tiene UI. Necesito una forma de afectar programáticamente esta configuración.

He cambiado específicamente de GDI + a WPF porque GDI + tiene pérdidas de memoria en procesos de larga ejecución, como servicios & aplicaciones web.

Respuesta

3

La única forma que he sido capaz de afectar a la configuración de BitmapScalingMode es heredar de la clase DrawingVisual y configurarlo a través de su descriptor de acceso protegido:

// exposes BitmapScalingMode (also works for other protected properties) 
public class MyDrawingVisual : DrawingVisual 
{ 
    public BitmapScalingMode BitmapScalingMode 
    { 
     get { return this.VisualBitmapScalingMode; } 
     set { this.VisualBitmapScalingMode = value; } 
    } 
} 

Si alguien sabe de una mejor manera de establecer esto, me encantaría escucharlo.

Parece que esto funcionaría:

RenderOptions.SetBitmapScalingMode(myDrawingVisual, BitmapScalingMode.HighQuality); 

... pero no es así. Aparentemente estar fuera del tiempo de ejecución de ventana XAML debe significar que no puede establecer los valores apropiados.

1

El BitmapScalingMode predeterminado era Fant en 3.0 pero en 4.0 ahora es BiLinear. Puede cambiar el valor predeterminado de algunas maneras diferentes. Una pareja described here.

+0

El enlace no es exactamente el contexto en el que lo estoy usando. Estoy usando las clases y llamándolas programáticamente en vez de declarativamente. He intentado tanto llamar 'RenderOptions.SetBitmapScalingMode (..., BitmapScalingMode.HighQuality)' y 'RenderOptions.SetBitmapScalingMode (..., BitmapScalingMode.Fant)' en todos aquellos objetos sobre los cuales se implementa 'DependencyObject'. No parece tener ningún efecto. Los documentos implican que el objeto debe ser un descendiente de 'UIElement' o' DrawingGroup'. Yo no uso ninguno. – mckamey