2012-04-26 6 views
4

У меня есть большое изображение, которое я хочу изменить до 230 × 320 (точно). Я хочу, чтобы система изменила его размер без потери соотношения сторон. то есть, если изображение составляет 460 × 650, оно должно сначала изменить размер до 230 × 325, а затем обрезать дополнительные 5 пикселей высоты.Изменение размера с обрезкой с использованием ImageMagick.NET и C#

Я делаю следующее:

ImageMagickNET.Geometry geo = new ImageMagickNET.Geometry("230x320>"); 
img.Resize(geo); 

Но изображения не изменяется до точного размера 230 × 320.

Я использую ImageMagick.NET в C# 4.0.

ответ

5

Вот как я решил проблему.

private void ProcessImage(int width, int height, String filepath) 
    { 
     // FullPath is the new file's path. 
     ImageMagickNET.Image img = new ImageMagickNET.Image(filepath); 
     String file_name = System.IO.Path.GetFileName(filepath); 

     if (img.Height != height || img.Width != width) 
     { 
      decimal result_ratio = (decimal)height/(decimal)width; 
      decimal current_ratio = (decimal)img.Height/(decimal)img.Width; 

      Boolean preserve_width = false; 
      if (current_ratio > result_ratio) 
      { 
       preserve_width = true; 
      } 
      int new_width = 0; 
      int new_height = 0; 
      if (preserve_width) 
      { 
       new_width = width; 
       new_height = (int)Math.Round((decimal)(current_ratio * new_width)); 
      } 
      else 
      { 
       new_height = height; 
       new_width = (int)Math.Round((decimal)(new_height/current_ratio)); 
      } 


      String geomStr = width.ToString() + "x" + height.ToString(); 
      String newGeomStr = new_width.ToString() + "x" + new_height.ToString(); 

      ImageMagickNET.Geometry intermediate_geo = new ImageMagickNET.Geometry(newGeomStr); 
      ImageMagickNET.Geometry final_geo = new ImageMagickNET.Geometry(geomStr); 


      img.Resize(intermediate_geo); 
      img.Crop(final_geo); 

     } 

     img.Write(txtDestination.Text + "\\" + file_name); 
    } 
+1

Спасибо Тони! Я искал все решения для этой проблемы, и все ответы связаны с утилитой командной строки. Замечательно, что кто-то еще использует .NET API – Mark