Измените размер прозрачных изображений с помощью C#

Это небольшая библиотека, которая сериализует объект со всеми его дочерними элементами в JSON, а также анализирует его обратно:

https://github.com/Toubs/PyJSONSerialization/

26
задан Juha Syrjälä 8 May 2010 в 10:24
поделиться

4 ответа

Если бы нет никакого требования к сохранению типа файла после масштабирования, я рекомендовал бы следующий подход.

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. См. это сообщение в блоге об этом для получения дополнительной информации

Редактирование: я забыл избавляться от битовых массивов в примере; это было исправлено

52
ответ дан ChrisF 28 November 2019 в 06:41
поделиться

Это - основное, изменяют размеры функции, которую я использовал для нескольких моих приложений, который усиливает 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

5
ответ дан Dillie-O 28 November 2019 в 06:41
поделиться

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

у парня, который выполняет этот веб-сайт, есть сообщение в блоге, которое обсуждает несколько изображений, изменяющих размеры алгоритмов. Вы, вероятно, хотите изображение bicubic, масштабирующее алгоритм.

Лучшее Изображение, Изменяющее размеры

3
ответ дан Jonathan 28 November 2019 в 06:41
поделиться

Для всех, кто пытается использовать решение Маркуса Олссона для динамического изменения размера изображений и записи их в поток ответов.

Это не сработает:

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 );
}
1
ответ дан 28 November 2019 в 06:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: