2009-04-01 4 views
14

È possibile ridimensionare l'immagine in modo proporzionale in modo indipendente dal tipo di immagine (bmp, jpg, png, ecc.)?Come ridimensionare proporzionalmente l'immagine di qualsiasi tipo in .NET?

Ho questo codice e so che manca qualcosa (ma non so cosa):

public bool ResizeImage(string fileName, string imgFileName, 
    ImageFormat format, int width, int height) 
{ 
    try 
    { 
     using (Image img = Image.FromFile(fileName)) 
     { 
      Image thumbNail = new Bitmap(width, height, img.PixelFormat); 
      Graphics g = Graphics.FromImage(thumbNail); 
      g.CompositingQuality = CompositingQuality.HighQuality; 
      g.SmoothingMode = SmoothingMode.HighQuality; 
      g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      Rectangle rect = new Rectangle(0, 0, width, height); 
      g.DrawImage(img, rect); 
      thumbNail.Save(imgFileName, format); 
     } 
     return true; 
    } 
    catch (Exception) 
    { 
     return false; 
    } 
} 

Se non è possibile, come si può immagine proporzionale jpeg I ridimensionare?

So che usando this method, ma non so dove mettere questo (!).

+5

8-bit richiedono ri-quantizzazione e ri-dithering quando viene ridimensionata (che non è banale!). La soluzione migliore è utilizzare una libreria gestita progettata per gestire correttamente tutti i formati/edge case, mantenere le proporzioni, ecc. [La libreria ImageResizer] (http://imageresizingin.net/) è uno strumento collaudato per questa attività così come ritagliare, ruotare e lanciare. È open source, quindi se hai voglia di rotolare la tua soluzione, copia e incolla. Permette anche molte altre cose utili tramite plugin, come watermarking, caching del disco, blob sql, lettura S3, ecc. –

+0

È venuto qui per migliorare il mio resizer di immagini e ho scoperto The ImageResizer Library. È ECCELLENTE. +1 per Computer Linguist! – Chris

+1

L'url nella risposta di Computer Linguist sopra dovrebbe essere: http://imageresizing.net/ – glenatron

risposta

16

Prima di tutto, non stai afferrando l'altezza e la larghezza dell'immagine CORRENTE. Per ridimensionare proporzionalmente è necessario prendere l'altezza/larghezza attuale dell'immagine e ridimensionarla in base a ciò.

Da lì, trovare l'attributo più grande e ridimensionare proporzionalmente basato su quello.

Ad esempio, supponiamo che l'immagine corrente sia 800 x 600 e che si ridimensioni proporzionalmente all'interno di uno spazio 400 x 400. Prendi la massima proporzione (800) e trova il suo rapporto con la nuova dimensione. 800 -> 400 = .5 Ora prendi quel rapporto e moltiplicalo per la seconda dimensione (600 * .5 = 300).

Il nuovo formato è di 400 x 300. Ecco un esempio PHP (scusate .... si otterrà, però)

$thumb_width = 400; 
$thumb_height = 400; 

$orig_w=imagesx($src_img); 
$orig_h=imagesy($src_img);  

if ($orig_w>$orig_h){//find the greater proportion 
    $ratio=$thumb_width/$orig_w; 
    $thumb_height=$orig_h*$ratio; 
}else{ 
    $ratio=$thumb_height/$orig_h; 
    $thumb_width=$orig_w*$ratio; 
} 
9

Credo che il codice è bene, ma prendendo in larghezza e l'altezza come parametri è dove stai andando storto secondo me. Perché il chiamante di questo metodo deve decidere quanto vogliono la larghezza e l'altezza? Vorrei suggerire cambiando ad una percentuale: PNG e GIF

public bool ResizeImage(string fileName, string imgFileName, 
    ImageFormat format, int percent) 
{ 
    try 
    { 
     using (Image img = Image.FromFile(fileName)) 
     { 
      int width = img.Width * (percent * .01); 
      int height = img.Height * (percent * .01); 
      Image thumbNail = new Bitmap(width, height, img.PixelFormat); 
      Graphics g = Graphics.FromImage(thumbNail); 
      g.CompositingQuality = CompositingQuality.HighQuality; 
      g.SmoothingMode = SmoothingMode.HighQuality; 
      g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      Rectangle rect = new Rectangle(0, 0, width, height); 
      g.DrawImage(img, rect); 
      thumbNail.Save(imgFileName, format); 
     } 
     return true; 
    } 
    catch (Exception) 
    { 
     return false; 
    } 
} 
+6

Potrebbe essere molto importante per il chiamante sapere la dimensione esatta che vogliono che l'immagine sia ... per esempio, se ho un'immagine questo è 1024X768 e voglio ridurlo a 50X50 per una miniatura, non dovrei calcolare la percentuale. Personalmente, standardizzerei su larghezza/altezza e fornirò un sovraccarico percentuale che alla fine richiama la versione larghezza/altezza. Il meglio di entrambi e non un sacco di codice in più. – ctorx

+0

So che questo è un vecchio commento, ma ... personalmente fornire larghezza e altezza come vincolo e mantenere la razione dell'aspetto in modo che le immagini non risultino distorte. Si potrebbe anche solo voler ridimensionare il bordo più grande a 50, non importa se questo è l'altezza o la larghezza. –