2016-07-29 3 views
0

Im en utilisant le code suivant (adapté de Example #2 here) pour redimensionner une image en gardant le ratio d'aspect.Mais je continue à obtenir une bordure blanche autour des images redimensionnées.Qu'est-ce que je fais mal.Redimensionner l'image Garder le format de l'image Bordure de la ligne blanche

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

MISE À JOUR:

Sample image redimensionnée

enter image description here

dans Zoom coin Révèle la frontière blanche

enter image description here

+0

'float' est probablement à l'origine des calculs à 1 pixel court. Changer 'float' à' double' –

+0

@BarmakShemirani Merci ... En fait, la réponse ci-dessous a résolu le problème .. – techno

Répondre

1

Essayez de changer la ligne

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

Puisque vous voulez garder le ratio d'aspect la plupart du temps, vous finirez par avoir plus d'espace autour de l'image, donc si vous n'avez pas besoin que l'espace supplémentaire alors faire de la nouvelle taille de l'image propre à la nouvelle taille de destination

Edit:

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

Merci .. mais je ne parle pas de l'espace supplémentaire ... J'ai utilisé une autre fonction de recadrage pour recadrer cette off.Im parler de la bordure de la ligne blanche dans l'image ... Avez-vous vu la mise à jour .. – techno

+0

Essayez de commenter la ligne grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic; –

+0

Merci ... ça a marché ... quel était le problème? Le commentaire sur cette ligne réduit-il la qualité de l'image de sortie? – techno