How to resize an Image C#

前端 未结 17 2397
暗喜
暗喜 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:26

    This is the code that I worked out for a specific requirement ie: the destination is always in landscape ratio. It should give you a good start.

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

    Use below function with below example for changing image size :

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

    Not sure what is so difficult about this, do what you were doing, use the overloaded Bitmap constructor to create a re-sized image, the only thing you were missing was a cast back to the Image data type:

    public static Image resizeImage(Image imgToResize, Size size)
    {
        return (Image)(new Bitmap(imgToResize, size));
    }
    
    yourImage = resizeImage(yourImage, new Size(50,50));
    
    0 讨论(0)
  • 2020-11-21 23:28

    in this question, you'll have some answers, including mine:

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

    You can use the Accord.NET framework for this. It provides a few different methods of resizing:

    • Bicubic
    • Bilinear
    • Nearest Neighbour
    0 讨论(0)
提交回复
热议问题