2009-03-26 5 views
8

Ho immagini molto grandi (jpg) e voglio scrivere un programma csharp per scorrere i file e ridurre le dimensioni di ogni immagine del 75%.Crea miniatura e riduci dimensione immagine

ho provato questo:

Image thumbNail = image.GetThumbnailImage(800, 600, null, new IntPtr()); 

ma la dimensione del file è ancora molto grande.

Esiste comunque la possibilità di creare miniature e di ridurre le dimensioni del file?

+0

Che dimensioni stai passando, ovvero quali sono i valori di larghezza e altezza? – dirkgently

+0

sto creando file 800 x 600 – leora

risposta

18
private void CompressAndSaveImage(Image img, string fileName, 
     long quality) { 
    EncoderParameters parameters = new EncoderParameters(1); 
    parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality); 
    img.Save(fileName, GetCodecInfo("image/jpeg"), parameters); 
} 

private static ImageCodecInfo GetCodecInfo(string mimeType) { 
    foreach (ImageCodecInfo encoder in ImageCodecInfo.GetImageEncoders()) 
     if (encoder.MimeType == mimeType) 
      return encoder; 
    throw new ArgumentOutOfRangeException(
     string.Format("'{0}' not supported", mimeType)); 
} 

Usage:

Image myImg = Image.FromFile(@"C:\Test.jpg"); 
CompressAndSaveImage(myImg, @"C:\Test2.jpg", 10); 

in grado di comprimere Test.jpg con una qualità di 10 e salvarlo come Test2.jpg.

EDIT: potrebbe essere migliore come un metodo di estensione:

private static void SaveCompressed(this Image img, string fileName, 
     long quality) { 
    EncoderParameters parameters = new EncoderParameters(1); 
    parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality); 
    img.Save(fileName, GetCodecInfo("image/jpeg"), parameters); 
} 

Usage:

Image myImg = Image.FromFile(@"C:\Test.jpg"); 
myImg.SaveCompressed(@"C:\Test2.jpg", 10); 
+0

è possibile avere questa funzione restituire un tipo di immagine in quanto è necessario mantenere una determinata interfaccia – leora

+0

La compressione viene eseguita quando il file viene salvato. Puoi comunque utilizzare il tuo codice GetThumbnailImage, ma piuttosto che chiamare Image.Save, dovresti chiamare Image.SaveCompressed. AKAIK, non è possibile comprimere direttamente un oggetto Immagine e quindi restituirlo. –

+0

Non è necessario salvare in un file, poiché è possibile salvarlo in un flusso di memoria e ricreare la bitmap dal flusso di memoria, scartando successivamente lo stream. In questo modo, è possibile restituire l'immagine riducendo le sue dimensioni. –

0

Comprimi la tua immagine. Per le miniature, JPEG è sufficiente, poiché non stai cercando la qualità.

Image thumbNail = image.GetThumbnailImage(800, 600, null, new IntPtr()); 

thumbNail.Save(fileName, ImageFormat.Jpeg); 
0

Dalla documentazione GetThumbnailImage s':

Se l'immagine contiene un incorporato immagine di anteprima, questo metodo recupera la miniatura incorporata e la ridimensiona a la dimensione richiesta Se l'immagine non contiene un'immagine di anteprima incorporata, questo metodo crea un'immagine di anteprima ridimensionando l'immagine principale.

Suggerirei di utilizzare valori di larghezza e altezza minori. Prova:

// reduce the size of each image by 75% from original 800x600 
Image thumbNail = image..GetThumbnailImage(200, 150, null, IntPtr.Zero); 

Vedere codice sample.

Leggi anche la documentazione:

Il metodo GetThumbnailImage funziona bene quando la miniatura richiesta ha una dimensione di circa 120 x 120 pixel. Se si richiede un'immagine di anteprima di grandi dimensioni (ad esempio 300 x 300) da un'immagine con una miniatura incorporata, l'immagine di anteprima potrebbe presentare una notevole perdita di qualità. Potrebbe essere preferibile ridimensionare l'immagine principale (anziché ridimensionare la miniatura incorporata) chiamando il metodo DrawImage.

Penso che potresti voler dare un'occhiata all'API di ridimensionamento.

2

ImageMagick è uno strumento da riga di comando che è estremamente potente per la manipolazione delle immagini. L'ho usato per ridimensionare le immagini di grandi dimensioni e la creazione di miniature in circostanze in cui le proporzioni dell'immagine sorgente sono sconosciute o inaffidabili. ImageMagick è in grado di ridimensionare le immagini ad un'altezza o larghezza specifica mantenendo le proporzioni originali dell'immagine. Può anche aggiungere spazio attorno a un'immagine, se necessario. Tutto sommato molto potente e una bella astrazione dall'avere a che fare con .nets Image APIs.Per utilizzare lo strumento da riga di comando ImageMagick dall'interno di C# mi consiglia di utilizzare l'oggetto System.Diagnostics.ProcessStartInfo in questo modo:

ProcessStartInfo psi = new ProcessStartInfo(); 
psi.FileName = @"C:\Program Files\ImageMagick-6.5.0-Q16\convert.exe"; 
psi.UseShellExecute = false; 
psi.RedirectStandardOutput = true; 
psi.RedirectStandardError = true; 
psi.Arguments = string.Format("-size x{0} \"{1}\" -thumbnail 200x140 -background transparent -gravity center -extent 200x140 \"{2}\"", heightToResizeTo, originalTempFileLocation, resizedTempFileLocation); 

Process p = new Process(); 
p.StartInfo = psi; 
p.Start(); 
p.WaitForExit(); 

Utilizzando la scala% paramater si può facilmente ridurre le dimensioni dell'immagine del 75%