2012-03-12 12 views
6

Utworzono funkcję pozwalającą na umieszczenie przesłanych przezroczystych plików .png w bazie danych SQL Server i wyświetlanych na stronie internetowej za pośrednictwem HttpHandler.Jak zachować przezroczystość png?

Podczas gdy wszystko działa, przezroczystość png zmienia kolor na czarny, gdy jest wyświetlany na stronie internetowej. Czy istnieje sposób na zachowanie przejrzystości?

Oto mój serwis obraz, który wstawia do bazy danych z kontrolera 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); 
} 

A oto „ResizeImageFile” funkcja pomocnika:

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

Co muszę zrobić, aby zachować przezroczystość png? Proszę pokazać przykłady. Naprawdę nie jestem ekspertem od manipulacji obrazem.

Dzięki.

+2

Spróbuj użyć 'Format32bppArgb', aby zachować alfa (to" A "). –

+0

Należy unikać poprzedzania tytułów pytań słowem "C#" lub podobnym. Po to są te znaczniki. –

+0

Czy wiesz, czy oryginalny plik .png ma 8 bitów, czy jest w pełnym kolorze? –

Odpowiedz

5

Może spróbuj zmienić format pikseli z PixelFormat.Format24bppRgb na PixelFormat.Format32bppRgb. Potrzebujesz dodatkowych 8 bitów, aby utrzymać kanał alfa.

+0

Przypuszczam, że musi to być PixelFormat.Format32bppArgb, a nie PixelFormat.Format32bppRgb. Ponieważ zgodnie z jego komentarzem wyjaśniającym, 8 bitów nie jest używanych. – bafsar

3

Używanie PixelFormat.Format32bppRgb nie działa dla mnie. Podczas rysowania nowego obrazu działało jednak przy użyciu oldImage.PixelFormat. Tak więc odpowiadająca linia kodu staje się:

using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, oldImage.PixelFormat)) 
Powiązane problemy