Resize image in C# with aspect ratio and crop central image so there are no gaps

前端 未结 1 1007
一整个雨季
一整个雨季 2020-12-23 21:31

I\'m trying to resize user uploaded images to a landscape dimensions e.g. 450w and 250h while maintaining aspect ratio, but to avoid resized images like portrait images havi

相关标签:
1条回答
  • 2020-12-23 22:26

    You should pass needToFill = true:

    public static System.Drawing.Image FixedSize(Image image, int Width, int Height, bool needToFill)
            {
                #region calculations
                int sourceWidth = image.Width;
                int sourceHeight = image.Height;
                int sourceX = 0;
                int sourceY = 0;
                double destX = 0;
                double destY = 0;
    
                double nScale = 0;
                double nScaleW = 0;
                double nScaleH = 0;
    
                nScaleW = ((double)Width / (double)sourceWidth);
                nScaleH = ((double)Height / (double)sourceHeight);
                if (!needToFill)
                {
                    nScale = Math.Min(nScaleH, nScaleW);
                }
                else
                {
                    nScale = Math.Max(nScaleH, nScaleW);
                    destY = (Height - sourceHeight * nScale) / 2;
                    destX = (Width - sourceWidth * nScale) / 2;
                }
    
                if (nScale > 1)
                    nScale = 1;
    
                int destWidth = (int)Math.Round(sourceWidth * nScale);
                int destHeight = (int)Math.Round(sourceHeight * nScale);
                #endregion
    
                System.Drawing.Bitmap bmPhoto = null;
                try
                {
                    bmPhoto = new System.Drawing.Bitmap(destWidth + (int)Math.Round(2 * destX), destHeight + (int)Math.Round(2 * destY));
                }
                catch (Exception ex)
                {
                    throw new ApplicationException(string.Format("destWidth:{0}, destX:{1}, destHeight:{2}, desxtY:{3}, Width:{4}, Height:{5}",
                        destWidth, destX, destHeight, destY, Width, Height), ex);
                }
                using (System.Drawing.Graphics grPhoto = System.Drawing.Graphics.FromImage(bmPhoto))
                {
                    grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    grPhoto.CompositingQuality = CompositingQuality.HighQuality;
                    grPhoto.SmoothingMode = SmoothingMode.HighQuality;
    
                    Rectangle to =  new System.Drawing.Rectangle((int)Math.Round(destX), (int)Math.Round(destY), destWidth, destHeight);
                    Rectangle from = new System.Drawing.Rectangle(sourceX, sourceY, sourceWidth, sourceHeight);
                    //Console.WriteLine("From: " + from.ToString());
                    //Console.WriteLine("To: " + to.ToString());
                    grPhoto.DrawImage(image, to, from, System.Drawing.GraphicsUnit.Pixel);
    
                    return bmPhoto;
                }
            }
    
    0 讨论(0)
提交回复
热议问题