2010-03-11 16 views
7

Tengo una aplicación ASP.NET MVC 2 orientada a .NET 4 que necesita para poder cambiar el tamaño de las imágenes sobre la marcha y escribirlas en la respuesta.¿Está bien utilizar ensamblajes WPF en una aplicación web?

Tengo un código que hace esto y funciona. Estoy usando System.Drawing.dll.

Sin embargo, quiero mejorar mi código para que no solo cambie el tamaño de la imagen, sino que también la baje de 24 bits hacia abajo a una escala de grises de 4 bits. No pude, por mi vida, encontrar un código sobre cómo hacer esto con System.Drawing.dll.

Pero sí encontré un montón de cosas de WPF. Este es mi código de trabajo/muestra (se ejecuta en 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); 
} 

Se utiliza System.Xaml.dll, WindowsBase.dll, PresentationCore.dll y PresentationFramework.dll. Los espacios de nombres utilizados son: System.Windows.Controls, System.Windows.Media y System.Windows.Media.Imaging.

¿Hay algún problema al utilizar estos espacios de nombres en mi aplicación web? No parece correcto.

Si alguien sabe cómo reducir la profundidad de bits sin todas estas cosas de WPF (que apenas entiendo, por cierto) estaría encantado de ver eso también.

Respuesta

7

No hay problema. Puede usar fácilmente WPF para la manipulación de imágenes desde un sitio web ASP.NET. He utilizado WPF detrás de las escenas dentro de un sitio web varias veces antes, y funciona muy bien.

El único problema que me encontré es que muchas partes de WPF insisten en que los hilos de llamada sean hilos STA. Si su sitio web usa subprocesos de MTA, obtendrá un error que le indicará que WPF necesita subprocesos de STA. Para arreglar esto, use la clase STAThreadPool que publiqué en this answer.

+0

Voy a probar esto ahora mismo y ver cómo funciona. – Chris

+0

Funcionó. No se quejó de los hilos ni nada. Marcaré su respuesta como la respuesta, ya que proporcionó esta información adicional. – Chris

1

Mi comprensión (y no puedo encontrar una cita en este momento) es que oficialmente no es compatible. Sin embargo, en la práctica, parece funcionar bastante bien y no estaría solo al usar estas bibliotecas en una aplicación web. Además, incluso si puede encontrar una forma de hacerlo con System.Drawing, creo que oficialmente eso tampoco es compatible en el entorno web, aunque es más utilizado en ese entorno que WPF, lo que le da un nivel extra de seguridades.

+0

Interesante. ¿Hay alguna manera en que "se supone" que voy a cambiar el tamaño de las imágenes en una aplicación web, en el lado del servidor? Alguna manera apoyada? – Chris

+0

No lo sé, aparte de escribir/encontrar código que manipule los bytes directamente (yuck). En la práctica, todo el mundo ha usado tradicionalmente System.Drawing y ha funcionado bien. Y como dice Ray en su respuesta, usar WPF también funciona bien en la práctica. Si tuviera sus requisitos, lo haría, y solo me aseguro de haber probado a fondo (particularmente bajo carga). – itowlson

+0

¡Gracias por su pronta respuesta! – Chris

Cuestiones relacionadas