Как изменить размер изображения C # - PullRequest
254 голосов
/ 17 декабря 2009

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

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

// objImage is the original Image
Bitmap objBitmap = new Bitmap(objImage, new Size(227, 171));

Ответы [ 18 ]

4 голосов
/ 23 января 2019

Вы можете попробовать 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 - нецентральная композиция:

Owl

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

Owl smart crop

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

3 голосов
/ 28 июня 2016

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

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

http://imageprocessor.org/imageprocessor/

3 голосов
/ 19 февраля 2016

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

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

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

RenderOptions.SetBitmapScalingMode(
    bitmapSource,
    BitmapScalingMode.HighQuality);

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

1 голос
/ 01 февраля 2017

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

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);
                }
            }
        }
    }
}
0 голосов
/ 31 января 2018

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

var ms = new MemoryStream(File.ReadAllBytes(Source));
                    Bitmap objBitmap = new Bitmap(ms);
                    if (size.Height == 0)
                    {
                        size = objBitmap.Size;
                    }
                    objBitmap = new Bitmap(objBitmap, size);
                    objBitmap.Save(Destination);
0 голосов
/ 17 января 2018

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

//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;
                        }
                    }
0 голосов
/ 30 января 2017

Примечание: это не будет работать с 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");
}
0 голосов
/ 09 декабря 2016

Для этого вы можете использовать Accord.NET framework . Он предоставляет несколько различных методов изменения размера:

...