Ciao a tutti!
Da tempo sto usando del codice per ridimensionare delle immagini tratto da diverse fonti su HTML.IT (in particolare un codice di R.B. Riddick).

Adesso avrei l'esigenza di ridimensionare le immagini e in più tagliarle se l'altezza non è metà della larghezza. Il risultato finale dovrebbe essere quello di avere delle immagini 1000x500.

Qualche suggerimento?
Grazie.

codice:
 void Page_Load(object sender, System.EventArgs e)
  {
  
  } // void Page_Load(object sender, System.EventArgs e)
  
  
 bool IsImage(string fileName)
 {
  string ext = Path.GetExtension(fileName).ToLower();
  bool imageFlag = false;

  if (ext != null)
   {
    switch (ext)
     {
      case ".emf" : // Enhanced Windows metafile image format
      case ".exif" : // Exchangable Image Format
      case ".ico" : // Windows icon image format (extension .ico)
      case ".wmf" : // Windows metafile image format (extension .wmf)
      case ".png" : // Specifies the W3C Portable Network Graphics image format (extension .png)
      case ".gif" : // Graphics Interchange Format image format (extension .gif)
      case ".bmp" : //Bitmap image format (extension .bmp)
      case ".tiff" : // Tag Image File Format (extension .tif)
      case ".tif" : // Tag Image File Format (extension .tif)
      case ".jpeg" : // Joint Photographic Experts Group image format (extensions .jpg, .jpeg)
      case ".jpg" : imageFlag = true; break; // Joint Photographic Experts Group image format (extensions .jpg, .jpeg)

      default: imageFlag = false; break;  // Not a supported file type.
     } // switch (ext)
   } // if (ext != null)
  else
   imageFlag = false;

  return imageFlag;
 } // bool IsImage(string fileName)


 void CalcolaAspectRatio(double orgWidth, double orgHeight, ref double newWidth, ref double newHeight)
  {
   // Se le dimensioni dell'immagine originale e quelle nuove coincidono non facciamo nulla.
   if ((orgWidth == newWidth) && (orgHeight == newHeight)) return;
   
   // Se le dimensioni originali dell'immagine sono minori di quelle desiderate lasciamo stare.
   // In pratica NON facciamo l'ingrandimento della stessa.
   if ((newWidth > orgWidth) && (newHeight > orgHeight)) 
    {
     newWidth = orgWidth;
     newHeight = orgHeight;
     return;   
    }
    
   double resw = newWidth;
   double resh = newHeight;
   double aw = orgWidth / orgHeight; // fattore larghezza.
   double ah = orgHeight / orgWidth; // fattore altezza.
   
   // Se l'immagine è più piccola del Thumbnail forziamo le dimensioni di 
   // quest'ultimo alle dimensioni dell'immagine.
   if (resw > orgWidth) resw = orgWidth;
   if (resh > orgHeight) resh = orgHeight;
   // Se le dimensioni dell'immagine e del Thumbnail corrispondono non facciamo nulla.
   // quindi se l'immagine è quadrata...
   if (orgWidth != orgHeight)
    {
     // Se l'immagine non è quadrata
     // continuiamo a fare i nostri controlli per calcolarne le 
     // giuste dimensioni e quindi creare la nostra nuova immagine con
     // l'aspectratio corretto.
         
     // Se l'immagine è più larga che alta
     if (orgWidth > orgHeight)
      {
       // L > H => L = tL
       // La larghezza del TN sarà quella da noi stabilita
       // quindi dobbiamo solo assegnarla.
       resw = resw;
       // L'altezza del TN invece dovrà essere ricalcolata 
       // in proporzione alla larghezza dell'immagine originale.
       // L > H => tH =  tL * (H / L)
       resh = ah * resw;
      } // if (tmporgWidth > tmporgHeight)
     else
      {
       // Altrimenti se l'immagine è più alta
       if (orgWidth < orgHeight)
        {
         // L < H => H = tH
         // L'altezza del TN sarà quella da noi stabilita
         // quindi dobbiamo solo assegnarla.
         resh = resh;
         // La larghezza del TN invece dovrà essere ricalcolata 
         // in proporzione alla altezza dell'immagine originale.
         // L < H => tL = tH * (L / H)
         resw = aw * resh;
        } // if (orgWidth < orgHeight)
      } // else
    } // if (orgWidth != orgHeight)
        
   // assegnamo i valori calcolati alle nostre due variabili ed il gioco è fatto.    
   newWidth = resw;
   newHeight = resh;
 } // void CalcolaAspectRatio(double orgWidth, double orgHeight, ref double newWidth, ref double newHeight)
 
void UploadAndResizeAnImage(HttpPostedFile file, double newWidth, double newHeight, string virPath, bool overwrite)
  {
   string destPath = "/";
   double resWidth = 1.0;
   double resHeight = 1.0;
   bool owr = false;
   bool exist = false;

   if (virPath != "") destPath = virPath;
   if (newWidth > 0) resWidth = newWidth;
   if (newHeight > 0) resHeight = newHeight;
   
   if (overwrite)
    owr = true;
   else
    owr = false;

   int pathCheck = (destPath.Substring(destPath.LastIndexOf('/') + 1)).Length;
   if (pathCheck > 0) destPath += "/";

   string fileName = Path.GetFileName(file.FileName);
   string estensione = Path.GetExtension(file.FileName).ToLower();
   
   ImageCodecInfo[] imgCodec = ImageCodecInfo.GetImageEncoders();
   EncoderParameters encPars = new EncoderParameters(2);
   EncoderParameter encPar1 = new EncoderParameter( System.Drawing.Imaging.Encoder.Quality, 100L );
   EncoderParameter encPar2 = new EncoderParameter( System.Drawing.Imaging.Encoder.Compression, 100L );
   
   encPars.Param[0] = encPar1;
   encPars.Param[1] = encPar2;

   destPath = Server.MapPath(destPath);
   exist = File.Exists(destPath + fileName);
   
   if (!exist && (fileName.Length != 0) || owr)
    {
     if (!IsImage(fileName))
      {
       if (fileName.Length != 0)
         Status.Text += "<span style=\"color:Red;\">File '" + fileName + "' is not a valid image format. Upload... Aborted.</span><br>";
       return;
      } // if (!IsImage(fileName))

    
     using(System.Drawing.Image image = System.Drawing.Image.FromStream(file.InputStream))
      {
       CalcolaAspectRatio (image.Width, image.Height, ref resWidth, ref resHeight);
       
       using(Bitmap bitmap = new Bitmap((int)(resWidth), (int)(resHeight)))
        {
         string message = "Uploaded";
         
         bitmap.SetResolution(image.HorizontalResolution, image.VerticalResolution);
         
         Graphics g = Graphics.FromImage(bitmap);
         g.InterpolationMode = InterpolationMode.HighQualityBicubic;         
         g.SmoothingMode = SmoothingMode.HighQuality;
         g.PixelOffsetMode = PixelOffsetMode.HighQuality;
         g.CompositingQuality = CompositingQuality.HighQuality;
         g.DrawImage(image, new Rectangle(0, 0, (int)(resWidth), (int)(resHeight)));
         g.Dispose();
         
         if (exist && owr)
           {
           message = "OverWritted";
           try
            {
             File.Delete(destPath + fileName);    
            }
           catch(IOException ioe)
            {
               message = "<div id=\"error\">Error: " + ioe.GetType().Name + ": The write operation could not be performed because the specified part of the file is locked. Not OverWritted</div>";
            }
          } // if (exist && owr)

         if ((estensione == ".jpg") || (estensione == ".jpeg"))
          bitmap.Save(destPath + fileName, imgCodec[1], encPars);
         else
          bitmap.Save(destPath + fileName, image.RawFormat);
          
         Status.Text += "";
        } // using(Bitmap bitmap = new Bitmap( (int)(resWidth), (int)(resHeight)))
      } // using(Image image = Image.FromFile(file))
    } // if (!exist && (fileName.Length != 0) || owr)
   else
    {
     if (exist && (!owr))
        Status.Text += "<span style=\"color:Red;\">Error : The file \"<u><b><i>" + fileName + "</i></b></u>\" already exist... Upload Aborted.</span><br>";
    }

  } //  void UploadAndResizeAnImage(HttpPostedFile file, double newWidth, double newHeight, string virPath, bool overwrite)  
  
protected void SubmitButton_Click(Object sender, EventArgs e)
{
  HttpFileCollection uploadedFiles = Request.Files;

  for (int i = 0; i < uploadedFiles.Count; i ++)  
   {
    // Qui sotto definisci le dimensioni che vuoi, la cartella di destinazione
    // e se l'applicazione deve sovrascrivere o no i files preesistenti.
    //
    // UploadAndResizeAnImage(HttpPostedFile file, double newWidth, double newHeight, string virPath, bool overwrite)
    //
    // Quindi  se scrivo come qui sotto :

    UploadAndResizeAnImage(uploadedFiles[i], 1000.0, 500.0, "/images/news/foto/", true);
    // significa che voglio che ogni immagine inviata (uploadedFiles[i])
    // venga ridimensionata a 1024x768 (tenendo conto però delle proporzioni originali)
    // e che se il file esiste non deve essere sovrascritto (overwrite = false).
    // Chiaro? Più di così ;)

    // Vogliamo pure i Thumbnails??? allora aggiungiamo, sempre in questo ciclo for :
    //UploadAndResizeAnImage(uploadedFiles[i], 76.0, 76.0, "/images/news/thumb/", true);
    // significa che voglio che ogni immagine inviata (uploadedFiles[i])
    // venga ridimensionata a 150x150 (tenendo conto però delle proporzioni originali)
    // e che se il file esiste non deve essere sovrascritto (overwrite = false).
    
    // Cartella temporanea per scrivere poi nel db
    UploadAndResizeAnImage(uploadedFiles[i], 66.0, 99.0, "/images/news/temp/", true);
    
   Response.Redirect("chiudi1.asp"); 
   }
   
   
}