Как изменить размер изображения C #

288

Как Size, Widthи Heightявляется Get()свойством System.Drawing.Image;
Как я могу изменить размер объекта Image во время выполнения в C #?

Прямо сейчас я просто создаю новый, Imageиспользуя:

// objImage is the original Image
Bitmap objBitmap = new Bitmap(objImage, new Size(227, 171));
inutan
источник
2
Не правильный путь ... использует низкокачественную интерполяцию и может привести к тому, что исходный поток останется заблокированным на время нового растрового изображения ... Прочитайте список ошибок изменения размера изображения, прежде чем приступить к созданию собственного решения по изменению размера изображения.
Река Лилит
2
Избавьтесь от этого! Использование () {} работает!
Скотт Коутс
8
Если эти ответы полезны, попробуйте пометить принятый ответ.
Джоэл
3
Нет необходимости использовать какую-либо дополнительную библиотеку. Код, размещенный ниже Марком, работает отлично.
Элму
9
Кто такой Марк? Я не смог найти его ответ, но есть 3 комментария, которые относятся к нему.
Синатр

Ответы:

490

Это позволит выполнить качественное изменение размера:

/// <summary>
/// Resize the image to the specified width and height.
/// </summary>
/// <param name="image">The image to resize.</param>
/// <param name="width">The width to resize to.</param>
/// <param name="height">The height to resize to.</param>
/// <returns>The resized image.</returns>
public static Bitmap ResizeImage(Image image, int width, int height)
{
    var destRect = new Rectangle(0, 0, width, height);
    var destImage = new Bitmap(width, height);

    destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);

    using (var graphics = Graphics.FromImage(destImage))
    {
        graphics.CompositingMode = CompositingMode.SourceCopy;
        graphics.CompositingQuality = CompositingQuality.HighQuality;
        graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
        graphics.SmoothingMode = SmoothingMode.HighQuality;
        graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;

        using (var wrapMode = new ImageAttributes())
        {
            wrapMode.SetWrapMode(WrapMode.TileFlipXY);
            graphics.DrawImage(image, destRect, 0, 0, image.Width,image.Height, GraphicsUnit.Pixel, wrapMode);
        }
    }

    return destImage;
}
  • wrapMode.SetWrapMode(WrapMode.TileFlipXY) предотвращает ореолы вокруг границ изображения - наивное изменение размера будет производить выборку прозрачных пикселей за границами изображения, но, отражая изображение, мы можем получить более качественный образец (эта настройка очень заметна)
  • destImage.SetResolution поддерживает DPI независимо от физического размера - может повысить качество при уменьшении размеров изображения или при печати
  • Компоновка контролирует, как пиксели смешиваются с фоном - может не потребоваться, поскольку мы рисуем только одну вещь.
    • graphics.CompositingModeопределяет, будут ли пиксели исходного изображения перезаписаны или объединены с фоновыми пикселями. SourceCopyуказывает, что при отображении цвета он перезаписывает цвет фона.
    • graphics.CompositingQuality определяет уровень качества рендеринга многослойных изображений.
  • graphics.InterpolationMode определяет, как рассчитываются промежуточные значения между двумя конечными точками
  • graphics.SmoothingMode указывает, используют ли сглаживание для линий, кривых и краев заполненных областей (также называемых сглаживанием) - возможно, работает только на векторах
  • graphics.PixelOffsetMode влияет на качество рендеринга при рисовании нового изображения

Поддержание соотношения сторон оставлено для читателя в качестве упражнения (на самом деле, я просто не думаю, что это функция этой функции, чтобы сделать это для вас).

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

mpen
источник
4
Код работал отлично при изменении размера изображения, но увеличил размер с 66 КБ до 132 КБ. Мотыга я могу уменьшить его
Chamara
3
@chamara Это, вероятно, из-за сохранения качества, которое вы выбрали. См. Msdn.microsoft.com/en-us/library/bb882583(v=vs.110).aspx Try quality = 90
mpen
3
@kstubs Вы уверены, что есть. BitmapПо сути, это просто имя класса, вы можете сохранить его как файл любого типа.
mpen
5
@dotNetBlackBelt Вам, вероятно, нужно добавить ссылку на System.Drawingи добавитьusing System.Drawing.Imaging;
mpen
2
Это не будет поддерживать оригинальное соотношение сторон, верно?
Каспер Сков
148

Не уверен, что в этом такого сложного, делайте то, что вы делали, используйте перегруженный конструктор Bitmap для создания изображения с измененным размером, единственное, чего вам не хватало, было приведение к типу данных Image:

    public static Image resizeImage(Image imgToResize, Size size)
    {
       return (Image)(new Bitmap(imgToResize, size));
    }

    yourImage = resizeImage(yourImage, new Size(50,50));
Matt
источник
2
Разве вы не должны распоряжаться, yourImageпрежде чем присвоить его новому изображению?
Ник Шоу
3
Вы можете утилизировать его вручную или позволить сборщику мусора выполнить свою работу. Не важно.
Эльму
23
Этот код не дает никакого контроля над качеством изменения размера, что очень важно. Посмотрите на ответ от Марка.
Элму
43

в этом вопросе у вас будет несколько ответов, включая мой:

public Image resizeImage(int newWidth, int newHeight, string stPhotoPath)
 {
     Image imgPhoto = Image.FromFile(stPhotoPath); 

     int sourceWidth = imgPhoto.Width;
     int sourceHeight = imgPhoto.Height;

     //Consider vertical pics
    if (sourceWidth < sourceHeight)
    {
        int buff = newWidth;

        newWidth = newHeight;
        newHeight = buff;
    }

    int sourceX = 0, sourceY = 0, destX = 0, destY = 0;
    float nPercent = 0, nPercentW = 0, nPercentH = 0;

    nPercentW = ((float)newWidth / (float)sourceWidth);
    nPercentH = ((float)newHeight / (float)sourceHeight);
    if (nPercentH < nPercentW)
    {
        nPercent = nPercentH;
        destX = System.Convert.ToInt16((newWidth -
                  (sourceWidth * nPercent)) / 2);
    }
    else
    {
        nPercent = nPercentW;
        destY = System.Convert.ToInt16((newHeight -
                  (sourceHeight * nPercent)) / 2);
    }

    int destWidth = (int)(sourceWidth * nPercent);
    int destHeight = (int)(sourceHeight * nPercent);


    Bitmap bmPhoto = new Bitmap(newWidth, newHeight,
                  PixelFormat.Format24bppRgb);

    bmPhoto.SetResolution(imgPhoto.HorizontalResolution,
                 imgPhoto.VerticalResolution);

    Graphics grPhoto = Graphics.FromImage(bmPhoto);
    grPhoto.Clear(Color.Black);
    grPhoto.InterpolationMode =
        System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

    grPhoto.DrawImage(imgPhoto,
        new Rectangle(destX, destY, destWidth, destHeight),
        new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight),
        GraphicsUnit.Pixel);

    grPhoto.Dispose();
    imgPhoto.Dispose();
    return bmPhoto;
}
Vinzz
источник
5
Вы забыли imgPhoto.Dispose (); файл хранится в пользовании
шрутизет
1
Это очень полезно, и я использую это в моем приложении. Однако важно отметить, что этот алгоритм не работает с прозрачными изображениями. Он превращает все прозрачные пиксели в черные. Его, вероятно, легко исправить, но это просто примечание для пользователей. :)
мем
1
Разве вы не предполагаете сохранить изображение? imgPhoto.Save ()?
Хлыст
@meme Можете ли вы дать ссылку о том, как исправить этот черный фон для прозрачного документа.
Сайед Мохамед
25

Почему бы не использовать System.Drawing.Image.GetThumbnailImageметод?

public Image GetThumbnailImage(
    int thumbWidth, 
    int thumbHeight, 
    Image.GetThumbnailImageAbort callback, 
    IntPtr callbackData)

Пример:

Image originalImage = System.Drawing.Image.FromStream(inputStream, true, true);
Image resizedImage = originalImage.GetThumbnailImage(newWidth, (newWidth * originalImage.Height) / originalWidth, null, IntPtr.Zero);
resizedImage.Save(imagePath, ImageFormat.Png);

Источник: http://msdn.microsoft.com/en-us/library/system.drawing.image.getthumbnailimage.aspx

Лино Сильва
источник
6
Это не правильный способ изменить размер изображения. Это вытягивает миниатюру из JPG, если он существует. Если его не существует, у вас нет контроля над качеством или новым изображением. Кроме того, этот код как есть имеет утечки памяти.
Роберт Смит
1
@Bobrot Почему это приведет к утечке памяти?
пользователь
2
Все в библиотеке GDI все еще работает неуправляемо. Без использования оператора using или последующего удаления объектов, системе может понадобиться много времени, чтобы собрать эти объекты и снова освободить память.
Роберт Смит
9
Это как вы говорите: это может занять много времени. Но это НЕ утечка памяти. Это было бы утечкой памяти, если память никогда не будет освобождена. Но это НОРМАЛЬНОЕ поведение сборщика мусора, когда он освобождает память, когда процессор простаивает. Оператор using () не предотвращает утечки памяти. Он просто сразу освобождает память, а сборщик мусора освобождает память, когда у него есть время для этого. Это единственная разница в этом конкретном случае.
Элмю
Смотрите подводные камни изменения размера изображения: nathanaeljones.com/blog/2009/20-image-resizing-pitfalls "Использование GetThumbnailImage (). GetThumbnailImage () кажется очевидным выбором, и многие статьи рекомендуют его использовать. К сожалению, он всегда захватывает встроенный jpeg Миниатюра, если присутствует. Некоторые фотографии имеют такие, некоторые нет - обычно это зависит от вашей камеры. Вы будете удивляться, почему GetThumbnailImage хорошо работает на некоторых фотографиях, но на других ужасно размыто. GetThumbnailImage () не является надежным для фотографий большего размера чем 10px на 10px по этой причине. "
Ник Пейнтер
12

Вы можете попробовать net-vips , привязку C # для libvips . Это ленивая, потоковая, управляемая по требованию библиотека обработки изображений, поэтому она может выполнять такие операции без необходимости загружать все изображение.

Например, он поставляется с удобным приложением для просмотра изображений:

Image image = Image.Thumbnail("image.jpg", 300, 300);
image.WriteToFile("my-thumbnail.jpg");

Он также поддерживает интеллектуальное кадрирование, способ интеллектуального определения наиболее важной части изображения и удержания его в фокусе при кадрировании изображения. Например:

Image image = Image.Thumbnail("owl.jpg", 128, crop: "attention");
image.WriteToFile("tn_owl.jpg");

Где owl.jpgнецентральная композиция:

Сова

Дает этот результат:

Сова умный урожай

Сначала он сжимает изображение, чтобы получить вертикальную ось до 128 пикселей, а затем обрезает до 128 пикселей по attentionстратегии. Этот ищет изображение, которое может привлечь внимание человека, см. Smartcrop()Подробности.

kleisauke
источник
Ваша привязка к libvips кажется великолепной. Я обязательно посмотрю вашу библиотеку. Спасибо, что сделали это доступным для C # Developer!
FrenchTastic
Это превосходно! Я понятия не имел, что библиотека обработки изображений может выглядеть так хорошо.
Дальвир
отлично! лучше, чем ImageMagick Heavy
Моше Л
10

Это будет -

  • Изменить ширину и высоту без необходимости петли
  • Не превышает исходные размеры изображений

//////////////

private void ResizeImage(Image img, double maxWidth, double maxHeight)
{
    double resizeWidth = img.Source.Width;
    double resizeHeight = img.Source.Height;

    double aspect = resizeWidth / resizeHeight;

    if (resizeWidth > maxWidth)
    {
        resizeWidth = maxWidth;
        resizeHeight = resizeWidth / aspect;
    }
    if (resizeHeight > maxHeight)
    {
        aspect = resizeWidth / resizeHeight;
        resizeHeight = maxHeight;
        resizeWidth = resizeHeight * aspect;
    }

    img.Width = resizeWidth;
    img.Height = resizeHeight;
}
Dominic
источник
11
ОП спрашивал о System.Drawing.Image, где ваш код не будет работать, так как свойства «Ширина» и «Высота» не могут быть установлены. Это, однако, будет работать для System.Windows.Controls.Image.
мммдрег
10
public static Image resizeImage(Image image, int new_height, int new_width)
{
    Bitmap new_image = new Bitmap(new_width, new_height);
    Graphics g = Graphics.FromImage((Image)new_image );
    g.InterpolationMode = InterpolationMode.High;
    g.DrawImage(image, 0, 0, new_width, new_height);
    return new_image;
}
NeoSvet
источник
Вы забыли утилизировать графику. Кажется, тот же принцип, что и новый Bitmap (изображение, ширина, высота) с лучшим режимом интерполяции. Мне интересно, что такое дефолт ? Это даже хуже чем Low?
Синатр
9

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

    public Image resizeImage(int newWidth, int newHeight, string stPhotoPath)
    {
        Image imgPhoto = Image.FromFile(stPhotoPath);

        int sourceWidth = imgPhoto.Width;
        int sourceHeight = imgPhoto.Height;

        //Consider vertical pics
        if (sourceWidth < sourceHeight)
        {
            int buff = newWidth;

            newWidth = newHeight;
            newHeight = buff;
        }

        int sourceX = 0, sourceY = 0, destX = 0, destY = 0;
        float nPercent = 0, nPercentW = 0, nPercentH = 0;

        nPercentW = ((float)newWidth / (float)sourceWidth);
        nPercentH = ((float)newHeight / (float)sourceHeight);
        if (nPercentH < nPercentW)
        {
            nPercent = nPercentH;
            destX = System.Convert.ToInt16((newWidth -
                      (sourceWidth * nPercent)) / 2);
        }
        else
        {
            nPercent = nPercentW;
            destY = System.Convert.ToInt16((newHeight -
                      (sourceHeight * nPercent)) / 2);
        }

        int destWidth = (int)(sourceWidth * nPercent);
        int destHeight = (int)(sourceHeight * nPercent);


        Bitmap bmPhoto = new Bitmap(newWidth, newHeight,
                      PixelFormat.Format24bppRgb);

        bmPhoto.SetResolution(imgPhoto.HorizontalResolution,
                     imgPhoto.VerticalResolution);

        Graphics grPhoto = Graphics.FromImage(bmPhoto);
        grPhoto.Clear(Color.White);
        grPhoto.InterpolationMode =
            System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

        grPhoto.DrawImage(imgPhoto,
            new Rectangle(destX, destY, destWidth, destHeight),
            new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight),
            GraphicsUnit.Pixel);

        grPhoto.Dispose();
        imgPhoto.Dispose();

        return bmPhoto;
    }
Раджеш
источник
7

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

/// <summary>
    /// Resize image with a directory as source
    /// </summary>
    /// <param name="OriginalFileLocation">Image location</param>
    /// <param name="heigth">new height</param>
    /// <param name="width">new width</param>
    /// <param name="keepAspectRatio">keep the aspect ratio</param>
    /// <param name="getCenter">return the center bit of the image</param>
    /// <returns>image with new dimentions</returns>
    public Image resizeImageFromFile(String OriginalFileLocation, int heigth, int width, Boolean keepAspectRatio, Boolean getCenter)
    {
        int newheigth = heigth;
        System.Drawing.Image FullsizeImage = System.Drawing.Image.FromFile(OriginalFileLocation);

        // Prevent using images internal thumbnail
        FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
        FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);

        if (keepAspectRatio || getCenter)
        {
            int bmpY = 0;
            double resize = (double)FullsizeImage.Width / (double)width;//get the resize vector
            if (getCenter)
            {
                bmpY = (int)((FullsizeImage.Height - (heigth * resize)) / 2);// gives the Y value of the part that will be cut off, to show only the part in the center
                Rectangle section = new Rectangle(new Point(0, bmpY), new Size(FullsizeImage.Width, (int)(heigth * resize)));// create the section to cut of the original image
                //System.Console.WriteLine("the section that will be cut off: " + section.Size.ToString() + " the Y value is minimized by: " + bmpY);
                Bitmap orImg = new Bitmap((Bitmap)FullsizeImage);//for the correct effect convert image to bitmap.
                FullsizeImage.Dispose();//clear the original image
                using (Bitmap tempImg = new Bitmap(section.Width, section.Height))
                {
                    Graphics cutImg = Graphics.FromImage(tempImg);//              set the file to save the new image to.
                    cutImg.DrawImage(orImg, 0, 0, section, GraphicsUnit.Pixel);// cut the image and save it to tempImg
                    FullsizeImage = tempImg;//save the tempImg as FullsizeImage for resizing later
                    orImg.Dispose();
                    cutImg.Dispose();
                    return FullsizeImage.GetThumbnailImage(width, heigth, null, IntPtr.Zero);
                }
            }
            else newheigth = (int)(FullsizeImage.Height / resize);//  set the new heigth of the current image
        }//return the image resized to the given heigth and width
        return FullsizeImage.GetThumbnailImage(width, newheigth, null, IntPtr.Zero);
    }

Для облегчения доступа к функции можно добавить несколько перегруженных функций:

/// <summary>
    /// Resize image with a directory as source
    /// </summary>
    /// <param name="OriginalFileLocation">Image location</param>
    /// <param name="heigth">new height</param>
    /// <param name="width">new width</param>
    /// <returns>image with new dimentions</returns>
    public Image resizeImageFromFile(String OriginalFileLocation, int heigth, int width)
    {
        return resizeImageFromFile(OriginalFileLocation, heigth, width, false, false);
    }

    /// <summary>
    /// Resize image with a directory as source
    /// </summary>
    /// <param name="OriginalFileLocation">Image location</param>
    /// <param name="heigth">new height</param>
    /// <param name="width">new width</param>
    /// <param name="keepAspectRatio">keep the aspect ratio</param>
    /// <returns>image with new dimentions</returns>
    public Image resizeImageFromFile(String OriginalFileLocation, int heigth, int width, Boolean keepAspectRatio)
    {
        return resizeImageFromFile(OriginalFileLocation, heigth, width, keepAspectRatio, false);
    }

Теперь последние два логических значения необязательны для установки. Вызовите функцию следующим образом:

System.Drawing.Image ResizedImage = resizeImageFromFile(imageLocation, 800, 400, true, true);
Quispie
источник
6
public string CreateThumbnail(int maxWidth, int maxHeight, string path)
{

    var image = System.Drawing.Image.FromFile(path);
    var ratioX = (double)maxWidth / image.Width;
    var ratioY = (double)maxHeight / image.Height;
    var ratio = Math.Min(ratioX, ratioY);
    var newWidth = (int)(image.Width * ratio);
    var newHeight = (int)(image.Height * ratio);
    var newImage = new Bitmap(newWidth, newHeight);
    Graphics thumbGraph = Graphics.FromImage(newImage);

    thumbGraph.CompositingQuality = CompositingQuality.HighQuality;
    thumbGraph.SmoothingMode = SmoothingMode.HighQuality;
    //thumbGraph.InterpolationMode = InterpolationMode.HighQualityBicubic;

    thumbGraph.DrawImage(image, 0, 0, newWidth, newHeight);
    image.Dispose();

    string fileRelativePath = "newsizeimages/" + maxWidth + Path.GetFileName(path);
    newImage.Save(Server.MapPath(fileRelativePath), newImage.RawFormat);
    return fileRelativePath;
}

Нажмите здесь http://bhupendrasinghsaini.blogspot.in/2014/07/resize-image-in-c.html

бхупендра сингх
источник
6

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

public Image ResizeImage(Image source, RectangleF destinationBounds)
{
    RectangleF sourceBounds = new RectangleF(0.0f,0.0f,(float)source.Width, (float)source.Height);
    RectangleF scaleBounds = new RectangleF();

    Image destinationImage = new Bitmap((int)destinationBounds.Width, (int)destinationBounds.Height);
    Graphics graph = Graphics.FromImage(destinationImage);
    graph.InterpolationMode =
        System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

    // Fill with background color
    graph.FillRectangle(new SolidBrush(System.Drawing.Color.White), destinationBounds);

    float resizeRatio, sourceRatio;
    float scaleWidth, scaleHeight;

    sourceRatio = (float)source.Width / (float)source.Height;

    if (sourceRatio >= 1.0f)
    {
        //landscape
        resizeRatio = destinationBounds.Width / sourceBounds.Width;
        scaleWidth = destinationBounds.Width;
        scaleHeight = sourceBounds.Height * resizeRatio;
        float trimValue = destinationBounds.Height - scaleHeight;
        graph.DrawImage(source, 0, (trimValue / 2), destinationBounds.Width, scaleHeight);
    }
    else
    {
        //portrait
        resizeRatio = destinationBounds.Height/sourceBounds.Height;
        scaleWidth = sourceBounds.Width * resizeRatio;
        scaleHeight = destinationBounds.Height;
        float trimValue = destinationBounds.Width - scaleWidth;
        graph.DrawImage(source, (trimValue / 2), 0, scaleWidth, destinationBounds.Height);
    }

    return destinationImage;

}
Лесли Маршалл
источник
Потрясающие!!! У меня были проблемы с портретным изображением, и после того, как я попробовал много решений, которые искали в Интернете, это было ТОЛЬКО ИДЕАЛЬНО! СПАСИБО БОЛЬШОЕ!
Фабио
3

Если вы работаете с BitmapSource:

var resizedBitmap = new TransformedBitmap(
    bitmapSource,
    new ScaleTransform(scaleX, scaleY));

Если вы хотите более точный контроль качества, запустите сначала:

RenderOptions.SetBitmapScalingMode(
    bitmapSource,
    BitmapScalingMode.HighQuality);

(По умолчанию это BitmapScalingMode.Linearэквивалентно BitmapScalingMode.LowQuality.)

Матин Улхак
источник
3

Я использую ImageProcessorCore, в основном потому, что работает .Net Core.

И это имеет больше возможностей, таких как преобразование типов, обрезка изображений и многое другое

http://imageprocessor.org/imageprocessor/

topolm
источник
1
Я посмотрел, и это не поддерживает .NET Core. Это построено против полной структуры.
chrisdrobison
1

Измените размер и сохраните изображение, чтобы оно соответствовало ширине и высоте, как холст, сохраняя пропорции изображения

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;

namespace Infra.Files
{
    public static class GenerateThumb
    {
        /// <summary>
        /// Resize and save an image to fit under width and height like a canvas keeping things proportional
        /// </summary>
        /// <param name="originalImagePath"></param>
        /// <param name="thumbImagePath"></param>
        /// <param name="newWidth"></param>
        /// <param name="newHeight"></param>
        public static void GenerateThumbImage(string originalImagePath, string thumbImagePath, int newWidth, int newHeight)
        {
            Bitmap srcBmp = new Bitmap(originalImagePath);
            float ratio = 1;
            float minSize = Math.Min(newHeight, newHeight);

            if (srcBmp.Width > srcBmp.Height)
            {
                ratio = minSize / (float)srcBmp.Width;
            }
            else
            {
                ratio = minSize / (float)srcBmp.Height;
            }

            SizeF newSize = new SizeF(srcBmp.Width * ratio, srcBmp.Height * ratio);
            Bitmap target = new Bitmap((int)newSize.Width, (int)newSize.Height);

            using (Graphics graphics = Graphics.FromImage(target))
            {
                graphics.CompositingQuality = CompositingQuality.HighSpeed;
                graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                graphics.CompositingMode = CompositingMode.SourceCopy;
                graphics.DrawImage(srcBmp, 0, 0, newSize.Width, newSize.Height);

                using (MemoryStream memoryStream = new MemoryStream())
                {
                    target.Save(thumbImagePath);
                }
            }
        }
    }
}
Эндрю Паес
источник
1

Используйте функцию ниже с примером ниже для изменения размера изображения:

//Example : 
System.Net.Mime.MediaTypeNames.Image newImage = System.Net.Mime.MediaTypeNames.Image.FromFile("SampImag.jpg");
System.Net.Mime.MediaTypeNames.Image temImag = FormatImage(newImage, 100, 100);

//image size modification unction   
public static System.Net.Mime.MediaTypeNames.Image FormatImage(System.Net.Mime.MediaTypeNames.Image img, int outputWidth, int outputHeight)
{

    Bitmap outputImage = null;
    Graphics graphics = null;
    try
    {
         outputImage = new Bitmap(outputWidth, outputHeight, System.Drawing.Imaging.PixelFormat.Format16bppRgb555);
         graphics = Graphics.FromImage(outputImage);
         graphics.DrawImage(img, new Rectangle(0, 0, outputWidth, outputHeight),
         new Rectangle(0, 0, img.Width, img.Height), GraphicsUnit.Pixel);

         return outputImage;
     }
     catch (Exception ex)
     {
           return img;
     }
}
Прасад К.М.
источник
2
Пожалуйста, объясните в своем ответе выше, как использовать этот код, что делает код и как он решает проблему в исходном вопросе.
Тим Визе
Я также добавил вариант использования. Используйте приведенную выше функцию с приведенным ниже примером. Изображение newImage = Image.FromFile ("SampImag.jpg"); Изображение temImag = FormatImage (newImage, 100, 100);
Прасад КМ
0

Примечание: это не будет работать с ASP.Net Core, потому что WebImage зависит от System.Web, но в предыдущих версиях ASP.Net я использовал этот фрагмент много раз и был полезен.

String ThumbfullPath = Path.GetFileNameWithoutExtension(file.FileName) + "80x80.jpg";
var ThumbfullPath2 = Path.Combine(ThumbfullPath, fileThumb);
using (MemoryStream stream = new MemoryStream(System.IO.File.ReadAllBytes(fullPath)))
{
      var thumbnail = new WebImage(stream).Resize(80, 80);
      thumbnail.Save(ThumbfullPath2, "jpg");
}
JoshYates1980
источник