Это небольшая библиотека, которая сериализует объект со всеми его дочерними элементами в JSON, а также анализирует его обратно:
Если бы нет никакого требования к сохранению типа файла после масштабирования, я рекомендовал бы следующий подход.
using (Image src = Image.FromFile("main.gif"))
using (Bitmap dst = new Bitmap(100, 129))
using (Graphics g = Graphics.FromImage(dst))
{
g.SmoothingMode = SmoothingMode.AntiAlias;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(src, 0, 0, dst.Width, dst.Height);
dst.Save("scale.png", ImageFormat.Png);
}
результат будет иметь действительно хорошие анти-искаженные края
, Если необходимо экспортировать изображение в gif, Вы находитесь в для поездки; GDI + не играет хорошо с gif. См. это сообщение в блоге об этом для получения дополнительной информации
Редактирование: я забыл избавляться от битовых массивов в примере; это было исправлено
Это - основное, изменяют размеры функции, которую я использовал для нескольких моих приложений, который усиливает GDI +
/// <summary>
/// Resize image with GDI+ so that image is nice and clear with required size.
/// </summary>
/// <param name="SourceImage">Image to resize</param>
/// <param name="NewHeight">New height to resize to.</param>
/// <param name="NewWidth">New width to resize to.</param>
/// <returns>Image object resized to new dimensions.</returns>
/// <remarks></remarks>
public static Image ImageResize(Image SourceImage, Int32 NewHeight, Int32 NewWidth)
{
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(NewWidth, NewHeight, SourceImage.PixelFormat);
if (bitmap.PixelFormat == Drawing.Imaging.PixelFormat.Format1bppIndexed | bitmap.PixelFormat == Drawing.Imaging.PixelFormat.Format4bppIndexed | bitmap.PixelFormat == Drawing.Imaging.PixelFormat.Format8bppIndexed | bitmap.PixelFormat == Drawing.Imaging.PixelFormat.Undefined | bitmap.PixelFormat == Drawing.Imaging.PixelFormat.DontCare | bitmap.PixelFormat == Drawing.Imaging.PixelFormat.Format16bppArgb1555 | bitmap.PixelFormat == Drawing.Imaging.PixelFormat.Format16bppGrayScale)
{
throw new NotSupportedException("Pixel format of the image is not supported.");
}
System.Drawing.Graphics graphicsImage = System.Drawing.Graphics.FromImage(bitmap);
graphicsImage.SmoothingMode = Drawing.Drawing2D.SmoothingMode.HighQuality;
graphicsImage.InterpolationMode = Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphicsImage.DrawImage(SourceImage, 0, 0, bitmap.Width, bitmap.Height);
graphicsImage.Dispose();
return bitmap;
}
, я не помню первое, что пришло на ум, если это будет работать с GIFs, но можно дать ему попытку.
Примечание: Я не могу взять полный кредит на эту функцию. Я соединил несколько вещей от некоторых других образцов онлайн и заставил его работать к моим потребностям 8^D
Я думаю, что проблема состоит в том, что Вы делаете, основанное на строке развертки изменяют размеры, который собирается привести к неровностям, неважно, как трудно Вы настраиваете его. Хорошее изображение изменяет размеры качества, требует, чтобы Вы сделали еще некоторую работу для выяснения среднего цвета предварительно измененных пикселей, которые покрывает измененный пиксель.
у парня, который выполняет этот веб-сайт, есть сообщение в блоге, которое обсуждает несколько изображений, изменяющих размеры алгоритмов. Вы, вероятно, хотите изображение bicubic, масштабирующее алгоритм.
Для всех, кто пытается использовать решение Маркуса Олссона для динамического изменения размера изображений и записи их в поток ответов.
Это не сработает:
Response.ContentType = "image/png";
dst.Save( Response.OutputStream, ImageFormat.Png );
Но это будет:
Response.ContentType = "image/png";
using (MemoryStream stream = new MemoryStream())
{
dst.Save( stream, ImageFormat.Png );
stream.WriteTo( Response.OutputStream );
}