2014-10-21 3 views
1

Мне нужно знать, как изменить размер изображения, чтобы оно было в коробке, без слишком большого изображения. Ящик имеет установленную ширину и высоту, и я хочу, чтобы изображение заполнило как можно большую часть окна, но поддерживало соотношение сторон, которое оно изначально имело.Как изменить размер изображения, поддерживающего соотношение сторон в C#

ответ

7
//calculate the ratio 
double dbl = (double)image.Width/(double)image.Height; 

//set height of image to boxHeight and check if resulting width is less than boxWidth, 
//else set width of image to boxWidth and calculate new height 
if((int)((double)boxHeight * dbl) <= boxWidth) 
{ 
    resizedImage = new Bitmap(original, (int)((double)boxHeight * dbl), boxHeight); 
} 
else 
{ 
    resizedImage = new Bitmap(original, boxWidth, (int)((double)boxWidth/dbl)); 
} 

формула для масштабирования с тем же соотношением является:

newWidth = (int)((double)boxHeight * dbl) 

or 

newHeight = (int)((double)boxWidth/dbl) 
+1

Немного объяснения кода? Или, может быть, некоторые комментарии в вашем коде? –

+1

@JohnDemetriou См. Отредактированный ответ с комментариями –

+0

@MuhammadBashir. Ваше предлагаемое редактирование может иметь хороший код, но его, вероятно, следует написать как новый ответ, поскольку это было бы большим изменением для этого принятого ответа. – AdrianHHH

1
Bitmap original,resizedImage; 
try 
       { 

        using (FileStream fs = new System.IO.FileStream(imageLabel.Text, System.IO.FileMode.Open)) 
        { 

         original = new Bitmap(fs); 
        } 

        int rectHeight = BOXWIDTH; 
        int rectWidth = BOXWIDTH; 
        //if the image is squared set it's height and width to the smallest of the desired dimensions (our box). In the current example rectHeight<rectWidth 
        if (original.Height == original.Width) 
        { 
         resizedImage = new Bitmap(original, rectHeight, rectHeight); 
        } 
        else 
        { 
         //calculate aspect ratio 
         float aspect = original.Width/(float)original.Height; 
         int newWidth, newHeight; 
         //calculate new dimensions based on aspect ratio 
         newWidth = (int)(rectWidth * aspect); 
         newHeight = (int)(newWidth/aspect); 
         //if one of the two dimensions exceed the box dimensions 
         if (newWidth > rectWidth || newHeight > rectHeight) 
         { 
          //depending on which of the two exceeds the box dimensions set it as the box dimension and calculate the other one based on the aspect ratio 
          if (newWidth > newHeight) 
          { 
           newWidth = rectWidth; 
           newHeight = (int)(newWidth/aspect); 

          } 
          else 
          { 
           newHeight = rectHeight; 
           newWidth = (int)(newHeight * aspect); 

          } 
         } 
         resizedImage = new Bitmap(original, newWidth, newHeight); 



        } 
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show(ex.Message); 
       } 
      } 
+4

Слишком много коды что-то вроде этого –

+0

Вида многословные, но с некоторой очисткой это будет намного намного короче ... –

+0

@AdrianoRepetti One * if-else * достаточно –

-1

Я считаю, что если вы только измените высоту или только ширину, она останется в лучших соотношениях, и ширина/высота изменится вместе с ней. Таким образом, вы можете попробовать, что

+0

Нет, вы не можете сохранить фиксированный размер. Представьте, что у вас есть изображение 100x50, и вы должны нарисовать его в коробке 200x200: вы бы нарисовали изображение 200x50? 100x200? Сохраняя соотношение сторон, оно будет 200x100 –

+0

да, но если вы хотите 200 * 200 и просто измените его на то, что коэффициенты будут выключены. Но да, если вы хотите 200 * 200 на картинке 100 * 50, это не будет работать. Это только в том случае, если вы хотите сохранить коэффициенты – Koen

+0

В этом весь вопрос. Изменение максимально приближенного к желаемым размерам при сохранении формата изображения –

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