Як змінити розмір зображення 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));

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 впливає на якість візуалізації під час малювання нового зображення

Підтримка співвідношення сторін залишається як вправа для читача (насправді, я просто не думаю, що це робота цієї функції робити для вас).

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


4
код відмінно працював під час зміни розміру зображення, але збільшив розмір з 66 КБ до 132 КБ.
Ох,

3
@chamara Це, мабуть, пов'язано із збереженням обраної вами якості. Дивіться msdn.microsoft.com/en-us/library/bb882583(v=vs.110).aspx Спробуйте якість = 90
30

3
@kstubs Ви впевнені. Bitmapпо суті є лише іменем класу, ви можете зберегти його, як би ви хотіли, будь-який тип файлу.
1616

5
@dotNetBlackBelt Можливо, вам потрібно буде додати посилання System.Drawingта додатиusing System.Drawing.Imaging;
mpen

2
Це не підтримуватиме початкове співвідношення сторін?
Каспер Сков

148

Не впевнений, що так важко в цьому, робіть те, що ви робили, використовуйте перевантажений конструктор Bitmap, щоб створити зображення, розмір якого було розміщено.

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

    yourImage = resizeImage(yourImage, new Size(50,50));

2
Чи не слід ви розпоряджатися yourImageперед призначенням нового зображення?
Нік Шоу

3
Ви можете утилізувати його вручну або ви можете дозволити сміттєзбірнику працювати. Неважливо.
Elmue

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;
}

5
Ви забули imgPhoto.Dispose (); файл зберігається у використанні
shrutyzet

1
Це дуже корисно, і я використовую це у своєму додатку. Однак важливо зазначити, що цей алгоритм не працює з прозорими зображеннями. Він перетворює всі прозорі пікселі в чорні. Його, ймовірно, легко виправити, але це лише примітка для користувачів. :)
мем

1
Хіба ви не можете зберегти зображення? imgPhoto.Save ()?
Whiplash

@meme Чи можете ви надати посилання про те, як виправити цей чорний фон для прозорого документа.
Syed Mohamed

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, все ще працює некерованим. Не використовуючи згоду використання заявки або позбавляючи від об'єктів, система може зайняти багато часу, щоб збирати сміття з цих об'єктів і знову робити пам'ять.
Роберт Сміт

9
Як ви кажете: це може зайняти тривалий час. Але це НЕ витік пам'яті. Це було б витоком пам'яті, якщо пам'ять НІКОЛИ не звільнятиметься. Але це НОРМАЛЬНА поведінка сміттєзбірника, що він звільняє пам'ять, коли ЦП не працює. Оператор using () не запобігає витоку пам'яті. Він просто звільняє пам'ять негайно, поки сміттєзбірник звільняє пам'ять, коли встигає це зробити. Це єдина різниця в цьому конкретному випадку.
Елмуе

Дивіться підводні камені зміни розміру зображення: nathanaeljones.com/blog/2009/20-image-resizing-pitfalls "Використання GetThumbnailImage (). GetThumbnailImage () здається очевидним вибором, і багато статей рекомендують його використання. На жаль, він завжди захоплює вбудований jpeg Деякі фотографії мають такі, а деякі - ні, зазвичай це залежить від вашої камери. Ви будете замислюватися, чому GetThumbnailImage добре працює на одній фотографії, а на інших жахливо розмивається. ніж 10 пікселів на 10 пікселів з цієї причини. "
Нік Пентер

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()з деталями.


Ваша прив'язка до libvips здається чудовою. Я обов'язково погляну на вашу губу. Дякуємо, що зробили це доступним для розробника C #!
ФранцузькийТастичний

Це чудово! Я не уявляв, що бібліотека обробки зображень може виглядати так добре.
дальвір

приємно! краще, ніж ImageMagick важкий
Moshe L

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;
}

11
ОП запитували про System.Drawing.Image, де ваш код не буде працювати, оскільки властивості "Ширина" та "Висота" не задаються. Однак це буде працювати для System.Windows.Controls.Image.
mmmdreg

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;
}

Ви забули розпоряджатися графікою. Здається, той же принцип, що і новий 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);

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/


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
Будь ласка, спробуйте розтлумачити у своїй відповіді вище, як використовувати цей код, що робить код і як він вирішує проблему в оригінальному запитанні.
Тім Візе

Я також додав випадок використання також. Скористайтеся вище функцієюз наведеним нижче прикладом. Image newImage = Image.FromFile ("SampImag.jpg"); Image temImag = FormatImage (newImage, 100, 100);
Prasad KM


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");
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.