Resim C # nasıl yeniden boyutlandırılır


288

Olarak Size, Widthve Heightvardır Get()özellikleri System.Drawing.Image;
Bir Image nesnesini çalışma zamanında C # ile nasıl yeniden boyutlandırabilirim?

Şu anda, sadece yeni bir Imagekullanarak oluşturuyorum:

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

2
Doğru yol değil ... düşük kaliteli enterpolasyon kullanır ve orijinal akışın yeni bitmap görüntüsü süresince kilitli kalmasına neden olabilir ... Kendi görüntü yeniden boyutlandırma çözümünüzü yapmadan önce görüntü yeniden boyutlandırma tuzakları listesini okuyun .
Lilith River

2
Atın! () {} Kullanmak işe yarıyor!
Scott Coates

8
Bu cevaplar faydalıysa, kabul edilen yanıtı işaretlemeyi düşünün.
Joel

3
Herhangi bir ek kitaplık kullanmaya gerek yoktur. Mark tarafından yayınlanan kod mükemmel çalışıyor.
Elmue

9
Mark kim? Cevabını bulamadım, ama buna atıfta bulunan 3 yorum var.
Sinatr

Yanıtlar:


490

Bu, yüksek kalitede yeniden boyutlandırma gerçekleştirir:

/// <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) görüntü sınırlarının etrafında gölgelenmeyi önler - saf yeniden boyutlandırma görüntü sınırlarının ötesinde saydam pikselleri örnekleyecektir, ancak görüntüyü yansıtarak daha iyi bir örnek alabiliriz (bu ayar çok dikkat çekicidir)
  • destImage.SetResolution fiziksel boyuttan bağımsız olarak DPI tutar - görüntü boyutlarını azaltırken veya yazdırırken kaliteyi artırabilir
  • Birleştirme, piksellerin arka planla nasıl karıştırıldığını kontrol eder - yalnızca bir şey çizdiğimiz için gerekli olmayabilir.
    • graphics.CompositingModekaynak görüntüdeki piksellerin üzerine yazılıp yazılmayacağını veya arka plan pikselleriyle birleştirilip birleştirilmeyeceğini belirler. SourceCopyrenk oluşturulduğunda arka plan renginin üzerine yazacağını belirtir.
    • graphics.CompositingQuality katmanlı görüntülerin oluşturma kalitesi düzeyini belirler.
  • graphics.InterpolationMode iki uç nokta arasındaki ara değerlerin nasıl hesaplandığını belirler
  • graphics.SmoothingMode çizgilerin, eğrilerin ve doldurulmuş alanların kenarlarının yumuşatma kullanıp kullanmadığını belirtir (kenar yumuşatma olarak da adlandırılır) - muhtemelen yalnızca vektörlerde çalışır
  • graphics.PixelOffsetMode yeni görüntüyü çizerken oluşturma kalitesini etkiler

En boy oranını korumak okuyucu için bir egzersiz olarak bırakılmıştır (aslında, bu işlevin sizin için bunu yapmanın işi olduğunu düşünmüyorum).

Ayrıca, bu görüntü yeniden boyutlandırma ile bazı tuzakları açıklayan iyi bir makale . Yukarıdaki işlev bunların çoğunu kapsayacaktır, ancak yine de tasarruf konusunda endişelenmeniz gerekir .


4
kodu, görüntüyü yeniden boyutlandırırken mükemmel çalıştı ancak boyutu 66 KB'tan 132 KB'ye çıkardı. Çapa azaltabilir miyim
chamara

3
@chamara Muhtemelen seçtiğiniz kalite tasarrufu nedeniyle. Bkz msdn.microsoft.com/en-us/library/bb882583(v=vs.110).aspx deneyin quality = 90
mpen

3
@kstubs Eminsiniz. Bitmapaslında sadece sınıfın adıdır, istediğiniz dosya türü olarak kaydedebilirsiniz.
mpen

5
@dotNetBlackBelt Muhtemelen bir referans System.Drawingeklemeniz ve eklemeniz gerekiyorusing System.Drawing.Imaging;
mpen

2
Bu, orijinal en boy oranını doğru tutmayacak mı?
Kasper Skov

148

Bunun ne kadar zor olduğundan emin değilim, ne yaptığınızı yapın, yeniden boyutlandırılmış bir görüntü oluşturmak için aşırı yüklenmiş Bitmap yapıcısını kullanın, eksik olan tek şey Görüntü veri türüne geri döndü:

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

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

2
yourImageYeni görüntüye atamadan önce imha etmemelisiniz ?
Nick Shaw

3
Manuel olarak atabilir veya çöp toplayıcının bu işi yapmasına izin verebilirsiniz. Önemli değil.
Elmue

23
Bu kod, çok önemli olan yeniden boyutlandırma kalitesi üzerinde hiçbir kontrol sağlamaz. Mark'ın cevabına bir göz atın.
Elmue

43

içinde bu soruya , sen de benim gibi bazı cevaplar, gerekecek:

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
İmgPhoto.Dispose () 'u unuttunuz. dosya kullanımda tutulur
shrutyzet

1
Bu çok yararlı ve bunu benim app kullanıyorum. Ancak bu algoritmanın saydam görüntülerle çalışmadığını unutmamak önemlidir. Tüm saydam pikselleri siyaha dönüştürür. Muhtemelen düzeltmesi kolay, ancak kullanıcılar için sadece bir not. :)
meme

1
Resmi kaydetmemeniz gerekiyor mu? imgPhoto.Save ()?
Whiplash

Saydam doc için siyah arka planın nasıl düzeltileceğine dair bağlantı verebilir misiniz?
Syed Mohamed

25

Neden System.Drawing.Image.GetThumbnailImageyöntemi kullanmıyorsunuz ?

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

Misal:

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

Kaynak: http://msdn.microsoft.com/tr-tr/library/system.drawing.image.getthumbnailimage.aspx


6
Bir görüntüyü yeniden boyutlandırmanın doğru yolu bu değildir. Bu, varsa jpg'den bir küçük resim çeker. Eğer yoksa, kalite veya yeni görüntü üzerinde hiçbir kontrole sahip değilsiniz. Ayrıca, bu kodda olduğu gibi bellek sızıntısı var.
Robert Smith

1
@Bobrot Bu neden bellek sızıntılarına neden olacak?
kullanıcı

2
GDI kitaplığındaki her şey hala yönetilmiyor. Bir kullanım ifadesi kullanmadan veya daha sonra nesneleri atmadan, sistemin bu nesneleri çöp toplaması ve belleği yeniden kullanılabilir hale getirmesi uzun zaman alabilir.
Robert Smith

9
Söylediğiniz gibi: Uzun zaman alabilir. Ancak bu bir bellek sızıntısı DEĞİLDİR. Bellek ASLA serbest bırakılmazsa, bellek sızıntısı olabilir. Ancak bu, CPU boşta olduğunda belleği serbest bıraktığı çöp toplayıcının NORMAL davranışıdır. Using () ifadesi bellek sızıntılarını önlemez. Çöp toplayıcı bunu yapmak için zamanı olduğunda belleği hemen boşaltır. Bu özel durumdaki tek fark bu.
Elmue

Görüntü yeniden boyutlandırma tuzaklarına bakın: nathanaeljones.com/blog/2009/20-image-resizing-pitfalls "GetThumbnailImage () kullanımı. GetThumbnailImage () bariz bir seçim gibi görünüyor ve birçok makale kullanımını tavsiye ediyor. Bazı fotoğraflar bunlara sahiptir, bazıları yoktur - genellikle kameranıza bağlıdır.Bir fotoğrafta neden GetThumbnailImage'ın iyi çalıştığını merak edeceksiniz, ancak diğerlerinde korkunç derecede bulanık. GetThumbnailImage () daha büyük fotoğraflar için güvenilir değil bu nedenle 10 pikselden 10 piksele kadar. "
Nick Painter

12

Sen deneyebilirsiniz net-VIP C # için bağlayıcı, libvips . Tembel, akışlı, talep odaklı bir görüntü işleme kütüphanesi olduğundan, tüm görüntüyü yüklemeye gerek kalmadan bu gibi işlemleri yapabilir.

Örneğin, kullanışlı bir resim küçük resmi ile birlikte gelir:

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

Ayrıca, görüntünün en önemli bölümünü akıllıca belirleme ve görüntüyü kırpırken odakta tutma yolu olan akıllı kesimi de destekler. Örneğin:

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

owl.jpgMerkez dışı bir kompozisyon nerede :

Baykuş

Bu sonucu verir:

Baykuş akıllı kırpma

Önce dikey ekseni 128 piksele almak için görüntüyü küçültür, ardından attentionstratejiyi kullanarak 128 piksele kadar kırpır. Bu, görüntüyü insan gözünü yakalayabilecek özellikler için arar, Smartcrop()ayrıntılar için bakın.


Libvips için bağlantınız harika görünüyor. Lib'inize kesinlikle bir göz atacağım. Bunu C # Developer'ın kullanımına sunduğunuz için teşekkür ederiz!
FrenchTastic

Bu mükemmel! Bir görüntü işleme kütüphanesinin bu kadar güzel görünebileceğine dair hiçbir fikrim yoktu.
dalvir

Güzel! ImageMagick heavy
Moshe L

10

Bu irade -

  • Döngü gerekmeden genişlik ve yüksekliği yeniden boyutlandırma
  • Resimlerin orijinal boyutlarını aşmıyor

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

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
OP, System.Drawing.Image hakkında soruyordu ve kodunuz 'Genişlik' ve 'Yükseklik' özellikleri ayarlanamayacağı için çalışmaz. Ancak, System.Windows.Controls.Image için çalışacaktır.
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;
}

Grafikleri atmayı unuttunuz. Daha iyi enterpolasyon moduyla yeni Bitmap (görüntü, genişlik, yükseklik) ile aynı prensibi görür . Merak ediyorum Varsayılan nedir? Bundan daha mı kötü Low?
Sinatr

9

Bu kod yukarıdaki cevaplardan birinden gönderilen aynıdır .. ama şeffaf piksel siyah yerine beyaza dönüştürür ... Teşekkürler :)

    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

Yaptığım uygulamada, çoklu seçeneklerle bir işlev oluşturmak gerekiyordu. Oldukça büyük, ancak görüntüyü yeniden boyutlandırıyor, en boy oranını koruyabilir ve yalnızca görüntünün merkezini döndürmek için kenarları kesebilir:

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

Fonksiyona erişmeyi kolaylaştırmak için aşırı yüklenmiş fonksiyonlar eklemek mümkündür:

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

Şimdi ayarlamak için isteğe bağlı son iki boolean vardır. İşlevi şu şekilde çağırın:

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

Buraya tıklayın http://bhupendrasinghsaini.blogspot.in/2014/07/resize-image-in-c.html


6

Bu, belirli bir gereksinim için çalıştığım kod yani: hedef her zaman yatay orantadır. Size iyi bir başlangıç ​​yapmalı.

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;

}

Müthiş !!! Bir portre görüntüsünde başı beladaydım ve web'de aranan birçok çözümü denedikten sonra, bu SADECE MÜKEMMEL! ÇOK TEŞEKKÜR EDERİM!
Fábio

3

Şunlarla çalışıyorsanız BitmapSource:

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

Kalite üzerinde daha iyi kontrol istiyorsanız, önce şunu çalıştırın:

RenderOptions.SetBitmapScalingMode(
    bitmapSource,
    BitmapScalingMode.HighQuality);

(Varsayılan, BitmapScalingMode.Lineareşdeğeridir BitmapScalingMode.LowQuality.)


3

ImageProcessorCore kullanıyorum, çünkü çoğunlukla .Net Core çalışıyor.

Türleri dönüştürme, görüntüleri kırpma ve daha fazlası gibi daha fazla seçeneğe sahiptir.

http://imageprocessor.org/imageprocessor/


1
Baktım ve bu .NET Core'u desteklemiyor. Tam çerçeveye karşı inşa edilmiştir.
chrisdrobison

1

Görüntüyü orantılı tutan bir tuval gibi genişlik ve yüksekliğe sığacak şekilde yeniden boyutlandırın ve kaydedin

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

Görüntü boyutunu değiştirmek için aşağıdaki örnekle aşağıdaki işlevi kullanın:

//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
Lütfen yukarıdaki cevabınızda bu kodun nasıl kullanılacağını, kodun ne yaptığını ve orijinal sorudaki sorunu nasıl çözdüğünü açıklamayı düşünün.
Tim Visée

Ben de kullanım durumu ekledim. Aşağıdaki işlevi kullanarak yukarıdaki işlevi kullanın. Image newImage = Image.FromFile ("SampImag.jpg"); Image temImag = FormatImage (newImage, 100, 100);
Prasad KM


0

Not: WebImage System.Web'e bağlı olduğu için bu ASP.Net Core ile çalışmaz, ancak ASP.Net'in önceki sürümlerinde bu snippet'i birçok kez kullandım ve kullanışlıydı.

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");
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.