Search code examples
c#.netbitmapgdi+system.drawing

Resize Image Keep Aspect Ratio White Line Border


Im using the following code (adapted from Example #2 here ) to Resize an Image keeping the aspect ratio.But i keep getting a white border around the resized images.What im i doing wrong.

 Bitmap ResizekeepAspectRatio(Bitmap imgPhoto, int Width, int Height)
            {
                int sourceWidth = imgPhoto.Width;
                int sourceHeight = imgPhoto.Height;
                int sourceX = 0;
                int sourceY = 0;
                int destX = 0;
                int destY = 0;

                float nPercent = 0;
                float nPercentW = 0;
                float nPercentH = 0;

                nPercentW = ((float)Width / (float)sourceWidth);
                nPercentH = ((float)Height / (float)sourceHeight);
                if (nPercentH < nPercentW)
                {
                    nPercent = nPercentH;
                    destX = System.Convert.ToInt16((Width -
                                  (sourceWidth * nPercent)) / 2);
                }
                else
                {
                    nPercent = nPercentW;
                    destY = System.Convert.ToInt16((Height -
                                  (sourceHeight * nPercent)) / 2);
                }

                int destWidth = (int)(sourceWidth * nPercent);
                int destHeight = (int)(sourceHeight * nPercent);

                Bitmap bmPhoto = new Bitmap(Width, Height,
                                  PixelFormat.Format24bppRgb);
                bmPhoto.SetResolution(imgPhoto.HorizontalResolution,
                                 imgPhoto.VerticalResolution);

                Graphics grPhoto = Graphics.FromImage(bmPhoto);
                grPhoto.Clear(Color.White);
                grPhoto.InterpolationMode =
                        InterpolationMode.HighQualityBicubic;

                grPhoto.DrawImage(imgPhoto,
                    new Rectangle(destX, destY, destWidth, destHeight),
                    new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight),
                    GraphicsUnit.Pixel);

                grPhoto.Dispose();
                return bmPhoto;
            }

UPDATE:

Sample Resized Image

enter image description here

Zooming in Corner Reveals White Border

enter image description here


Solution

  • Try to change the line

    Bitmap bmPhoto = new Bitmap(Width, Height,
                                  PixelFormat.Format24bppRgb);
    To 
     Bitmap bmPhoto = new Bitmap(destWidth, destHeight,
                              PixelFormat.Format24bppRgb);
    

    Since you want to keep the aspect ratio most of the time you will end up having extra space around the image so if you don't need that extra space then make the new picture size fit to the new destination size

    Edit:

    Try to comment out the line grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic