2017-01-14 3 views
0

Я написал этот метод для изменения размеров моих изображений, но возвращаемое изображение для моих прозрачных изображений PNG имеет черный фон. Какое решение?Использование Graphics.DrawImage, меняет фон моих прозрачных изображений PNG, на черный

Я пробовал Bitmap.MakeTransparent(), а также Graphics.Clear(), но не смог решить мою проблему. Я проверил все связанные вопросы, но не смог найти полезный ответ на мой вопрос.

public HttpResponseMessage ImageResizer(string path, int w,int h) 
    { 

     var imagePath = HttpContext.Current.Server.MapPath(path); 
     Bitmap image; 
     try 
     { 
      image = (Bitmap)System.Drawing.Image.FromFile(imagePath); 
     } 
     catch 
     { 
      HttpResponseMessage hrm = new HttpResponseMessage(); 
      return hrm; 
     } 

     int originalWidth = image.Width; 
     int originalHeight = image.Height; 

     // New width and height based on aspect ratio 
     int newWidth = w; 
     int newHeight = h; 

     // Convert other formats (including CMYK) to RGB. 
     Bitmap newImage = new Bitmap(newWidth, newHeight, PixelFormat.Format24bppRgb); 
     // Draws the image in the specified size with quality mode set to HighQuality 
     using (Graphics graphics = Graphics.FromImage(newImage)) 
     { 
      graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      graphics.SmoothingMode = SmoothingMode.AntiAlias; 
      graphics.CompositingQuality = CompositingQuality.HighQuality; 
      graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 

      using (var attribute = new ImageAttributes()) 
      { 
       attribute.SetWrapMode(WrapMode.TileFlipXY); 

       // draws the resized image to the bitmap 
       graphics.DrawImage(image, new Rectangle(0, 0, newImage.Width, newImage.Height), new Rectangle(0, 0, originalWidth, originalHeight), GraphicsUnit.Pixel); 
      } 
     } 
     // Get an ImageCodecInfo object that represents the PNG codec. 
     ImageCodecInfo imageCodecInfo = this.GetEncoderInfo(ImageFormat.Png); 

     // Create an Encoder object for the Quality parameter. 
     Encoder encoder = Encoder.Quality; 

     // Create an EncoderParameters object. 
     EncoderParameters encoderParameters = new EncoderParameters(1); 

     // Save the image as a PNG file with quality level. 
     EncoderParameter encoderParameter = new EncoderParameter(encoder, 10); 
     encoderParameters.Param[0] = encoderParameter; 
     var splitPath = imagePath.Split('.'); 
     string newPath = splitPath[0] + "ss5.png"; 
     newImage.Save(newPath, ImageFormat.Png); 

     MemoryStream memoryStream = new MemoryStream(); 
     newImage.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png); 
     HttpResponseMessage response = new HttpResponseMessage(); 
     response.Content = new ByteArrayContent(memoryStream.ToArray()); 
     response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/png"); 
     response.Content.Headers.ContentLength = memoryStream.Length; 
     return response; 
    } 

    private ImageCodecInfo GetEncoderInfo(ImageFormat format) 
    { 
     return ImageCodecInfo.GetImageDecoders().SingleOrDefault(c => c.FormatID == format.Guid); 
    } 

ответ

0

Вы используете PixelFormat.Format24bppRgb в вашем Bitmap конструктору. Этот формат ограничивает ваше растровое изображение до 3-х каналов: красного, зеленого и синего. Из-за этого растровое изображение, которое вы создаете, не поддерживает альфа (прозрачность a.k.a.) и по умолчанию будет иметь сплошное черное изображение. Когда вы рисуете изображение с прозрачностью в нем, альфа этого изображения будет либо предварительно размножаться, либо отбрасываться в зависимости от его формата.

Если вы хотите, чтобы сохранить новое изображение с прозрачностью, вы должны объявить его с PixelFormat.Format32bppArgb:

Bitmap newImage = new Bitmap(newWidth, newHeight, PixelFormat.Format32bppArgb); 
+0

Спасибо за ваше решение, он прекрасно работает. Изображения по-прежнему загружались из кеша браузера, и я думал, что ваше решение не работает. Благодарю. –

Смежные вопросы