2010-03-11 6 views
7

Ho un'app per ASP.NET MVC 2 che utilizza .NET 4 che deve essere in grado di ridimensionare le immagini al volo e scriverle nella risposta.È corretto utilizzare gli assembly WPF in un'app Web?

Ho codice che fa questo e funziona. Sto usando System.Drawing.dll.

Tuttavia, voglio migliorare il mio codice in modo che non solo sono il ridimensionamento dell'immagine, ma sto cadendo da 24bpp fino a 4bit scala di grigi. Non potrei, per la vita di me, trovare il codice su come farlo con System.Drawing.dll.

ma ho trovato un sacco di roba WPF. Questo è il mio codice di lavoro/di esempio (eseguito in LinqPad).

// Load the original 24 bit image 
var bitmapImage = new BitmapImage(); 
bitmapImage.BeginInit(); 
bitmapImage.UriSource = new Uri(@"C:\Temp\Resized\18_appa2_015.png", UriKind.Absolute); 
//bitmapImage.DecodePixelWidth = 600; 
bitmapImage.EndInit(); 

// Create the destination image 
var formatConvertedBitmap = new FormatConvertedBitmap(); 
formatConvertedBitmap.BeginInit(); 
formatConvertedBitmap.Source = bitmapImage; 
formatConvertedBitmap.DestinationFormat = PixelFormats.Gray4; 
formatConvertedBitmap.EndInit(); 

// Encode and dump the image to disk 
var encoder = new PngBitmapEncoder(); 
encoder.Frames.Add(BitmapFrame.Create(formatConvertedBitmap)); 
using (var fileStream = File.Create(@"C:\Temp\Resized\18_appa2_015_s2.png")) 
{ 
    encoder.Save(fileStream); 
} 

utilizza System.Xaml.dll, WindowsBase.dll, PresentationCore.dll e PresentationFramework.dll. Gli spazi dei nomi utilizzati sono: System.Windows.Controls, System.Windows.Media e System.Windows.Media.Imaging.

C'è qualche problema di utilizzare questi spazi dei nomi nella mia applicazione web? Non sembra giusto.

Se qualcuno sa come far cadere la profondità di bit, senza tutta questa roba WPF (che ho appena capito, BTW) sarei entusiasta di vedere anche questo.

risposta

7

Nessun problema. È possibile utilizzare facilmente WPF per la manipolazione delle immagini da un sito Web ASP.NET. Ho usato WPF dietro le quinte di un sito web diverse volte prima, e lo funziona alla grande.

L'unico problema che ho incontrato è che molte parti di WPF insistono sul fatto che i thread chiamanti siano thread STA. Se il tuo sito web utilizza thread MTA, riceverai un errore che ti dice che WPF ha bisogno di thread STA. Per risolvere questo problema, utilizzare la classe STAThreadPool che ho pubblicato in this answer.

+0

Ho intenzione di provare questo adesso e vedere come va. – Chris

+0

Ha funzionato. Non si lamentava di discussioni o altro. Contrassegnerò la tua risposta come risposta, dal momento che hai fornito queste informazioni aggiuntive. – Chris

1

mia comprensione (e non riesco a trovare una citazione in questo momento) è che questo non è ufficialmente supportato. Tuttavia, in pratica, sembra funzionare abbastanza bene e non si sarebbe da soli nell'usare queste librerie in un'app Web. Inoltre, anche se riesci a trovare un modo per farlo con System.Drawing, credo che ufficialmente non sia supportato nemmeno nell'ambiente Web - sebbene sia più ampiamente utilizzato in quell'ambiente rispetto a WPF, che ti offre un livello extra di rassicurazione.

+0

Interessante. C'è un modo in cui "suppongo" di ridimensionare le immagini in una web app, sul lato server? Qualche modo supportato? – Chris

+0

Non che io sappia, oltre a scrivere/trovare codice che manipoli direttamente i byte (yuck). In pratica, tutti hanno tradizionalmente utilizzato System.Drawing e ha funzionato correttamente. E come dice Ray nella sua risposta, l'uso di WPF funziona bene anche nella pratica. Se avessi le tue esigenze, ci proverei, e mi assicurerei solo di averlo testato a fondo (in particolare sotto carico). – itowlson

+0

Grazie per la pronta risposta! – Chris

Problemi correlati