2010-11-15 4 views
6

Я пытаюсь создать эскиз, используя помощник WebImage MVC3.MVC3 Помощник WebImage: изменение размера преобразует прозрачный фон в черный

Оригинальное изображение .png с прозрачным фоном. Я пытаюсь и изменяю его размер:

var image = blob.DownloadByteArray();  

new WebImage(image) 
    .Resize(50, 50) 
    .Write(); 

Результирующий миниатюра заменяет оригинальный прозрачный фон черным фоном.

+0

Я вижу это с WebImage.GetBytes ("PNG"). –

ответ

1

Вы должны изменить .Write, чтобы передать ожидаемый выходной тип. Он использует этот пройденный тип, чтобы определить, какой тип изображения использовать.

var image = blob.DownloadByteArray();  

new WebImage(image) 
    .Resize(50, 50) 
    .Write("png"); 
2

Вы должны написать собственный метод изменения размера для изображений gif и png. Я создал расширение для Web Image для изменения размеров изображений. Смотрите код моего метода ниже:

public static class WebImageExtension 
{ 
    private static readonly IDictionary<string, ImageFormat> TransparencyFormats = 
     new Dictionary<string, ImageFormat>(StringComparer.OrdinalIgnoreCase) 
      {{"png", ImageFormat.Png}, {"gif", ImageFormat.Gif}}; 

    public static WebImage Resize(this WebImage image, int width) 
    { 
     double aspectRatio = (double)image.Width/image.Height; 
     var height = Convert.ToInt32(width/aspectRatio); 

     ImageFormat format; 

     if (!TransparencyFormats.TryGetValue(image.ImageFormat.ToLower(), out format)) 
     { 
      return image.Resize(width, height); 
     } 

     using (Image resizedImage = new Bitmap(width, height)) 
     { 
      using (var source = new Bitmap(new MemoryStream(image.GetBytes()))) 
      { 
       using (Graphics g = Graphics.FromImage(resizedImage)) 
       { 
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
        g.DrawImage(source, 0, 0, width, height); 
       } 
      } 

      using (var ms = new MemoryStream()) 
      { 
       resizedImage.Save(ms, format); 
       return new WebImage(ms.ToArray()); 
      } 
     } 
    } 
} 
6

Это выше ответ велик, но я сделал некоторую тонкую настройку и реализован «сохранять пропорции» изображений, так что мы не до конца с растягиванием картинок.

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.IO; 
using System.Web.Helpers; 

public static class ResizePng 
{ 
    private static IDictionary<string, ImageFormat> _transparencyFormats = new Dictionary<string, ImageFormat>(StringComparer.OrdinalIgnoreCase) { { "png", ImageFormat.Png }, { "gif", ImageFormat.Gif } }; 

    public static WebImage ResizePreserveTransparency(this WebImage image, int width, int height) 
    { 
     ImageFormat format = null; 
     if (!_transparencyFormats.TryGetValue(image.ImageFormat, out format)) 
     { 
      return image.Resize(width, height); 
     } 

     //keep ratio ************************************* 
     double ratio = (double)image.Width/image.Height; 
     double desiredRatio = (double)width/height; 
     if (ratio > desiredRatio) 
     { 
      height = Convert.ToInt32(width/ratio); 
     } 
     if (ratio < desiredRatio) 
     { 
      width = Convert.ToInt32(height * ratio); 
     } 
     //************************************************ 

     using (Image resizedImage = new Bitmap(width, height)) 
     { 
      using (Bitmap source = new Bitmap(new MemoryStream(image.GetBytes()))) 
      { 
       using (Graphics g = Graphics.FromImage(resizedImage)) 
       { 
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
        g.DrawImage(source, 0, 0, width, height); 
       } 
      } 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       resizedImage.Save(ms, format); 
       return new WebImage(ms.ToArray()); 
      } 
     } 
    } 

}

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