2012-03-12 18 views
6

Ho creato una funzione per consentire l'inserimento di file .png trasparenti caricati in un database SQL Server e la visualizzazione su una pagina Web tramite HttpHandler.Come conservare la trasparenza png?

Mentre tutto funziona, la trasparenza png diventa nera quando viene visualizzata sulla pagina Web. C'è un modo per preservare la trasparenza?

Ecco il mio servizio di immagine che si inserisce nel database dal controller 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); 
} 

Ed ecco il "ResizeImageFile" funzione di supporto:

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(); 
      } 
     } 
    } 
} 

Che cosa devo fare per preservare la png trasparenza? Si prega di mostrare esempi. Non sono seriamente un esperto nella manipolazione delle immagini.

Grazie.

+2

Provare a utilizzare 'Format32bppArgb' per preservare alfa (che è 'A'). –

+0

Si prega di evitare il prefisso dei titoli delle domande con "C#" o simili. Questo è ciò che i tag sono per. –

+0

Sai se il tuo file .png originale è 8 bit o è a colori? –

risposta

5

Forse prova a cambiare il formato pixel in formato PixelFormat.Format24bppRgb su PixelFormat.Format32bppRgb. Sono necessari 8 bit extra per contenere il canale alfa.

+0

Suppongo che deve essere PixelFormat.Format32bppArgb, non PixelFormat.Format32bppRgb. Perché in base al commento di spiegazione, 8 bit non vengono utilizzati. – bafsar

3

Utilizzo di PixelFormat.Format32bppRgb non ha funzionato per me. Tuttavia, ciò che ha funzionato è l'utilizzo di oldImage.PixelFormat durante il disegno della nuova immagine. Così la linea corrispondente del codice diventa:

using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, oldImage.PixelFormat)) 
Problemi correlati