2011-02-15 13 views
6

Utilizando WebImage de la versión MVC3/WebMatrix. Cargando la siguiente imagen de una ruta de archivo:Por qué WebImage.Resize elimina la transparencia PNG

Sample Image - o - enter image description here

Ejecutar el siguiente código en su contra:

return new WebImage(path) 
     .Resize(120, 265) 
     .GetBytes("Png"); 

Resultados en una imagen con la transparencia despojados y negro que se utiliza en su lugar :

Blacked out transparency

Lo mismo sucede con RotateRight(), Rota teLeft() y FlipHorizantal() Sin embargo, si no llamo el método .Resize():

return new WebImage(path) 
     .GetBytes("Png"); 

La imagen es devuelto sin un problema.

+0

¿De qué es parte la imagen web? – Craigt

+0

System.Web.WebImage se envía como parte de MVC3 y/o WebMatrix, creo. –

+1

¿Puedes publicar un enlace a tu imagen real? El servicio de imágenes que utiliza SO lamentamente recomprime las cosas, por lo que si hay algo especial sobre su imagen específica, no podemos verlo. –

Respuesta

2

¿Es su imagen de 8 bits (color indexado)? Cuando las imágenes de 8 bits se redimensionan, a menudo se convierten de color indexado a RGB para que el resultado se vea más suave. Cambiar el tamaño de las imágenes sin cambiar la tabla de colores rara vez termina bien.

Si la imagen ya es RGB (24 bits o más), es un poco más compleja: ¿qué debe hacer el ajustador por los bordes de una imagen, en el borde entre "transparente" y "no transparente"? Muchos algoritmos de redimensionamiento harán algo parecido a "promediar los dos colores" en un borde (una vez más, para que la imagen se vea más suave), pero la mayoría no tiene ningún concepto de transparencia, y mucho menos la capacidad de PNG para tener múltiples niveles de translucidez.

Por lo tanto, la respuesta breve es "probablemente sea un error", no una implementación completa de las características de PNG.

La solución puede no existe, pero que iba a tratar:

  1. estadía en color de 8 bits si eso es una opción, o convertir antes de tiempo para 32 bits.
  2. Obtenga el color o índice de color del color transparente. Después de redimensionar, forzar ese valor para que sea transparente. Tenga en cuenta que debido al "alisado" antes mencionado, los bordes entre transparente y no transparente pueden no ser de ese color, y probablemente se verán como una mezcla de negro y el color que realmente desee.
  3. Si nada más, puede que necesite usar una biblioteca externa que le dé más control.
+0

Sé que es factible con WPF/System.Windows.Imaging.Media así que tendré que volver a las grandes armas en este caso. –

0

¿Intentó utilizar el método Write() en lugar de GetBytes()?

+0

'Write()' desafortunadamente llama 'GetBytes()' debajo de las escenas. –

Cuestiones relacionadas