2012-03-12 29 views
6

Creé una función para permitir que los archivos .png transparentes subidos se inserten en una base de datos de SQL Server y se muestren en una página web a través de un HttpHandler.Cómo preservar la transparencia png?

Mientras todo esto funciona, la transparencia png cambia a negro cuando se ve en la página web. ¿Hay alguna manera de preservar la transparencia?

Aquí es mi servicio de imágenes que se inserta en la base de datos desde el controlador MVC:

public void AddImage(int productId, string caption, byte[] bytesOriginal) 
{ 
    string jpgpattern = ".jpg|.JPG"; 
    string pngpattern = ".png|.PNG"; 
    string pattern = jpgpattern; 

    ImageFormat imgFormat = ImageFormat.Jpeg; 

    if (caption.ToLower().EndsWith(".png")) 
    { 
    imgFormat = ImageFormat.Png; 
    pattern = pngpattern; 
    } 

    ProductImage productImage = new ProductImage(); 
    productImage.ProductId = productId; 
    productImage.BytesOriginal = bytesOriginal; 
    productImage.BytesFull = Helpers.ResizeImageFile(bytesOriginal, 600, imgFormat); 
    productImage.BytesPoster = Helpers.ResizeImageFile(bytesOriginal, 198, imgFormat); 
    productImage.BytesThumb = Helpers.ResizeImageFile(bytesOriginal, 100, imgFormat); 
    productImage.Caption = Common.RegexReplace(caption, pattern, ""); 

    productImageDao.Insert(productImage); 
} 

Y aquí está la función auxiliar "ResizeImageFile":

public static byte[] ResizeImageFile(byte[] imageFile, int targetSize, ImageFormat imageFormat) 
{ 
    using (System.Drawing.Image oldImage = System.Drawing.Image.FromStream(new MemoryStream(imageFile))) 
    { 
     Size newSize = CalculateDimensions(oldImage.Size, targetSize); 
     using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, PixelFormat.Format24bppRgb)) 
     { 
      using (Graphics canvas = Graphics.FromImage(newImage)) 
      { 
      canvas.SmoothingMode = SmoothingMode.AntiAlias; 
      canvas.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      canvas.PixelOffsetMode = PixelOffsetMode.HighQuality; 
      canvas.DrawImage(oldImage, new Rectangle(new Point(0, 0), newSize)); 
      MemoryStream m = new MemoryStream(); 
      newImage.Save(m, imageFormat); 
      return m.GetBuffer(); 
      } 
     } 
    } 
} 

¿Qué necesito hacer para preservar la png transparencia? Por favor, muestre ejemplos. En serio, no soy un experto en la manipulación de imágenes.

Gracias.

+2

Intenta usar 'Format32bppArgb' para conservar alfa (eso es 'A'). –

+0

Por favor, evite el prefijo de sus títulos de pregunta con "C#" o similar. Para eso son las etiquetas. –

+0

¿Sabes si tu .png original es de 8 bits o es a todo color? –

Respuesta

5

Quizás intente cambiar el formato de píxel de PixelFormat.Format24bppRgb a PixelFormat.Format32bppRgb. Necesitas los 8 bits adicionales para contener el canal alfa.

+0

Supongo que debe ser PixelFormat.Format32bppArgb, no PixelFormat.Format32bppRgb. Porque según su comentario de explicación, no se usan 8 bits. – bafsar

3

El uso de PixelFormat.Format32bppRgb no funcionó para mí. Sin embargo, lo que funcionó fue usar oldImage.PixelFormat al dibujar la nueva imagen. Entonces la línea de código correspondiente se convierte en:

using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, oldImage.PixelFormat)) 
Cuestiones relacionadas