2013-04-14 5 views
2

У меня есть метод ниже, который я нашел в Интернете, который изменяет размер изображения до приблизительного размера, сохраняя соотношение сторон.Изменение размера изображений в C#

 public Image ResizeImage(Size size) 
    { 
     int sourceWidth = _Image.Width; 
     int sourceHeight = _Image.Height; 

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

     nPercentW = ((float)size.Width/(float)sourceWidth); 
     nPercentH = ((float)size.Height/(float)sourceHeight); 

     if (nPercentH > nPercentW) 
      nPercent = nPercentH; 
     else 
      nPercent = nPercentW; 

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

     Bitmap b = new Bitmap(destWidth, destHeight); 
     Graphics g = Graphics.FromImage((Image)b); 
     g.InterpolationMode = InterpolationMode.HighQualityBicubic; 

     g.DrawImage(_Image, 0, 0, destWidth, destHeight); 
     g.Dispose(); 

     return (Image)b; 
    } 

Я обычно прохожу в размерах с шириной 100px и высотой 100px - как часть моих требований я не могу иметь какое-либо одного измерения (высоту или ширину) находится под 100px, так что если аспект соотношение не является квадратным, другое измерение будет выше.

То, что я нахожу с помощью этого метода, иногда является одним из размеров будет составлять менее 100 пикселей - например, 96 пикселей или 99 пикселей. Как я могу изменить этот метод, чтобы этого не произошло?

+0

Я думаю, что самым простым способом было бы проверить destWidth или height для <100, если они затем умножают оба w и h на скаляр, полученный из минимума vals/erroneous val (надеюсь, это даст число, подобное 1.05 (не написано как ответ, так как его легче писать комментарии на моем телефоне!) – Sayse

+0

его bcz его поддерживающее соотношение сторон ur originasl picture –

ответ

2

Код просто неуместен. Он не набирает очки для использования математики с плавающей запятой, которая имеет умение скруглять неправильный путь, поэтому вы можете легко получить 99 пикселей вместо 100. Всегда предпочитайте математику с целыми числами, чтобы вы могли контролировать округление. И это просто не делает ничего, чтобы гарантировать, что один из размеров достаточно велик, способ получить 96 пикселей. Просто напишите лучший код. Как:

public static Image ResizeImage(Image img, int minsize) { 
     var size = img.Size; 
     if (size.Width >= size.Height) { 
      // Could be: if (size.Height < minsize) size.Height = minsize; 
      size.Height = minsize; 
      size.Width = (size.Height * img.Width + img.Height - 1)/img.Height; 
     } 
     else { 
      size.Width = minsize; 
      size.Height = (size.Width * img.Height + img.Width - 1)/img.Width; 
     } 
     return new Bitmap(img, size); 
    } 

я оставил комментарий, чтобы показать, что вы делаете, если вы только хотите, чтобы убедиться, что изображение является достаточно большим и принимать большие изображения. Это не было ясно из вопроса. Если это так, то повторите эту инструкцию if в предложении else.

+0

Что такое «+ img.Height - 1» для? –

+0

Это гарантирует, что размер всегда округлен. –

+0

Да , но почему? Есть ли в этом случае угол, где это необходимо? Он вводит небольшие ошибки (<1 пиксель), но я не вижу необходимости ... –

Смежные вопросы