2011-10-18 14 views
5

Sto provando a stampare un'immagine (codice QR) dall'app Silverlight 4, tuttavia l'immagine è antializzata quando stampata (ho provato sia la stampante di file XPS che la stampante hardware) l'immagine è sfocata, ed è non leggibile dal lettore di codici a barre.Silverlight stampa anti-aliasing

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

Sto usando questo semplice codice per stamparlo:

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"); 

risposta

2

Ho trovato una soluzione.

Quando si stampa il controllo Immagine in Silverlight 4, invia alla stampante non una "schermata di stampa" di un controllo immagine come appare nel proprio UserControl ma un'immagine impostata nella sua proprietà sorgente. Se generi due bitmap di risoluzioni 100x100 px e 1000x1000px e li metti in dimensioni 100x100px, Image controlla che il risultato di stampa non sia lo stesso previsto.

Quindi la soluzione è generare un'immagine ad alta risoluzione (o immagine di alto livello) e inserirla nei controlli Immagine della dimensione desiderata.

-1

Forse si tenta di cambiare la modalità di livellamento sulla grafica obiettare?

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

non c'è proprietà args.Graphics. System.Drawing.Drawing2D.SmoothingMode non è disponibile in Silverlight. –

+0

Forse se hai provato ad usare la proprietà None qui? http://10rem.net/blog/2010/05/01/crappy-image-resizing-in-wpf-try-renderoptionsbitmapscalingmode Non so se questo si riferisce. Sto solo cercando di essere utile. –

+0

System.Drawing.Drawing2D.SmoothingMode non è disponibile in Silverlight. Il link che hai fornito si riferisce a WPF. –

0

Sembra che hai incontrato una soluzione come stavo scrivendo il mio, ma io ti invia in ogni caso ...

La ragione per cui questo accade è che il PrintDocument sarà essenzialmente prendere l'UIElement (l'immagine), che normalmente si blocca su uno schermo da 96 DPI e lo converte in 600 DPI adatti alla stampa. Dal momento che non c'è modo di dire a questa operazione di alto livello come gestire il livellamento, quello che ottieni è quella brutta sfocatura.

Tuttavia, se si esegue il blit upscale, applicare l'immagine RenderTransform opposta all'immagine, quando PrintDocument aumenta l'immagine, il risultato sarà il blit ad alta risoluzione.

Una volta che avete i vostri ad alta risoluzione blit del codice QR (essenzialmente 600/96 = 6,25 volte più grande come normale), si applica una scala di trasformare che le dimensioni di nuovo verso il basso dalla stessa identica quantità:

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

Quando si stampa questo, si dovrebbero vedere i bordi taglienti.

Problemi correlati