MVC3 WebImage helper: resize преобразует прозрачный фон в черный
Я пытаюсь создать эскиз с помощью помощника MVC3 WebImage.
Исходное изображение.png с прозрачным фоном. Когда я пытаюсь изменить его размер следующим образом:
var image = blob.DownloadByteArray();
new WebImage(image)
.Resize(50, 50)
.Write();
Полученная миниатюра заменяет исходный прозрачный фон черным фоном.
3 ответа
Этот ответ превосходен, но я немного подстроил и реализовал "коэффициент сохранения" изображения, чтобы мы не получали растянутые изображения.
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());
}
}
}
}
Вы должны написать свой собственный метод изменения размера для изображений GIF и PNG. Я создал расширение для веб-изображения для изменения размера изображений. Смотрите код моего метода ниже:
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());
}
}
}
}
Вы должны изменить .Write
передать ожидаемый тип вывода. Он использует этот переданный тип, чтобы определить, какой тип изображения использовать.
var image = blob.DownloadByteArray();
new WebImage(image)
.Resize(50, 50)
.Write("png");