How to resize an Image C#

前端 未结 17 2395
暗喜
暗喜 2020-11-21 22:28

As Size, Width and Height are Get() properties of System.Drawing.Image;
How can I resize an Image object

相关标签:
17条回答
  • 2020-11-21 23:15

    You could try net-vips, the C# binding for libvips. It's a lazy, streaming, demand-driven image processing library, so it can do operations like this without needing to load the whole image.

    For example, it comes with a handy image thumbnailer:

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

    It also supports smart crop, a way of intelligently determining the most important part of the image and keeping it in focus while cropping the image. For example:

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

    Where owl.jpg is an off-centre composition:

    Gives this result:

    First it shrinks the image to get the vertical axis to 128 pixels, then crops down to 128 pixels across using the attention strategy. This one searches the image for features which might catch a human eye, see Smartcrop() for details.

    0 讨论(0)
  • 2020-11-21 23:15

    Note: this will not work with ASP.Net Core because WebImage depends on System.Web, but on previous versions of ASP.Net I used this snippet many times and was useful.

    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 讨论(0)
  • 2020-11-21 23:19

    This will -

    • Resize width AND height without the need for a loop
    • Doesn't exceed the images original dimensions

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

    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;
    }
    
    0 讨论(0)
  • 2020-11-21 23:20

    This code is same as posted from one of above answers.. but will convert transparent pixel to white instead of black ... Thanks:)

        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;
        }
    
    0 讨论(0)
  • 2020-11-21 23:24

    Why not use the System.Drawing.Image.GetThumbnailImage method?

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

    Example:

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

    Source: http://msdn.microsoft.com/en-us/library/system.drawing.image.getthumbnailimage.aspx

    0 讨论(0)
  • 2020-11-21 23:24

    In the application I made it was necessary to create a function with multiple options. It's quite large, but it resizes the image, can keep the aspect ratio and can cut of the edges to return only the center of the image:

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

    To make it easier to acces the function it's possible to add some overloaded functions:

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

    Now are the last two booleans optional to set. Call the function like this:

    System.Drawing.Image ResizedImage = resizeImageFromFile(imageLocation, 800, 400, true, true);
    
    0 讨论(0)
提交回复
热议问题