2011-10-18 7 views
5

Estoy tratando de imprimir una imagen (código QR) de la aplicación Silverlight 4, sin embargo, la imagen está antializada cuando se imprime (he probado tanto la impresora de archivos XPS como la impresora de hardware). no legible por lector de código de barras.Anti-aliasing de impresión Silverlight

Image from printed XPS document http://img805.imageshack.us/img805/7677/qraliasing.png

Estoy usando este código sencillo para imprimirlo:

WriteableBitmap bitmap = new WriteableBitmap(width, height); 
//write bitmap pixels 
Image image = new Image(){Stretch = Stretch.None}; 
image.Source = bitmap; 
image.Width = bitmap.PixelWidth; 
image.Height = bitmap.PixelHeight; 
//Print 
PrintDocument printDocument = new PrintDocument(); 
printDocument.PrintPage += (sender, args) => 
{ 
    args.PageVisual = image; 
}; 
printDocument.Print("QrCode"); 

Respuesta

2

He encontrado una solución.

Al imprimir el control de imagen en Silverlight 4, envía a la impresora no una "pantalla de impresión" de un control de imagen como se ve en su UserControl sino una imagen configurada en su propiedad de origen. Si genera dos mapas de bits con resoluciones de 100x100 px y 1000x1000px y los pone en controles de imagen de tamaño 100x100px, el resultado de la impresión no será el mismo que el esperado.

Por lo tanto, la solución es generar una imagen de alta resolución (o una imagen exclusiva) y ponerla en controles de imagen del tamaño deseado.

-1

¿Usted intentó cambiar el modo de suavizado en los gráficos objeto?

WriteableBitmap bitmap = new WriteableBitmap(width, height); 
//write bitmap pixels 
Image image = new Image(){Stretch = Stretch.None}; 
image.Source = bitmap; 
image.Width = bitmap.PixelWidth; 
image.Height = bitmap.PixelHeight; 
//Print 
PrintDocument printDocument = new PrintDocument(); 
printDocument.PrintPage += (sender, args) => 
{ 
    //**Add this** 
    args.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None; 

    args.PageVisual = image; 
}; 
printDocument.Print("QrCode"); 
+0

no hay propiedad de args.Graphics. System.Drawing.Drawing2D.SmoothingMode no está disponible en Silverlight. –

+0

¿Tal vez si trataste de usar la propiedad None aquí? http://10rem.net/blog/2010/05/01/crappy-image-resizing-in-wpf-try-renderoptionsbitmapscalingmode No sé si eso se relaciona. Solo trato de ser útil. –

+0

System.Drawing.Drawing2D.SmoothingMode no está disponible en Silverlight. El enlace que proporcionó se relaciona con WPF. –

0

Parece que he encontrado una solución que yo estaba escribiendo el mío, pero voy a presentar de todos modos ...

La razón por la que esto sucede es que el PrintDocument tendrá esencialmente el UIElement (su imagen), que normalmente cambia a una pantalla de 96 ppp, y sube a 600 ppp para imprimir. Como no hay forma de decir a esta operación exclusiva cómo manejar el suavizado, lo que obtienes es esa desagradable falta de nitidez.

Sin embargo, si usted hace el blitz de alto nivel usted mismo, luego aplique un RenderTransform opuesto a la imagen, cuando el PrintDocument va a escalar la imagen, su blit de alta resolución será el resultado.

Una vez que tenga de alta resolución blit del código QR (esencialmente 600/96 = 6,25 veces más grande que lo normal), se aplica una transformada de escala que los tamaños de nuevo hacia abajo por la misma cantidad:

image.RenderTransform = new ScaleTransform { 
    ScaleX = 96.0/600.0, 
    ScaleY = 96.0/600.0 
}; 

Cuando imprima esto, debería ver los bordes afilados.

Cuestiones relacionadas